Właśnie przeczytałem pytanie Generator liczb losowych AVR i spotkałem się z wieloma sposobami generowania losowych nasion w AVR:
- Użyj specjalnego „Bezpiecznego AVR”
- Użyj wewnętrznego czujnika temperatury
- Czytaj niepisaną pamięć EEPROM
- Zmierz odstępy czasu między danymi wprowadzanymi przez użytkownika
- Użyj pływającego pinu ADC.
Dlaczego nie tylko pojedynczy pin cyfrowy, skonfigurowany jako wejście bez podciągania i swobodnego? Teoretycznie powinno to generować strumień losowych bitów. Dlaczego tego nie użyć? Czy stan zmienia się zbyt wolno? Czy ma tendencję do zatrzymywania się na 1 lub 0? Jakieś inne problemy?
Odpowiedzi:
„Losowo” to podchwytliwe słowo. W niektórych kontekstach oznacza to po prostu „nieprzewidywalny”, ale w innych kontekstach - w szczególności związanych z przetwarzaniem sygnałów i kryptografią - oznacza „statystycznie nieskorelowany”.
Nawet jeśli wartość odczytana z pływającego pinu jest nieprzewidywalna („losowa” w pierwszym znaczeniu), prawdopodobnie nie będzie użyteczna w drugim znaczeniu.
źródło
Oczywista różnica między użyciem wejścia cyfrowego i analogowego polega na tym, że w analogu istnieje większy zakres wartości początkowych.
Po drugie, ale być może bardziej istotne: jeśli zmienna „mediana” cyfrowego pinu nie znajduje się dokładnie w połowie między poziomami logiki (które nie są poziomami mocy i szyny uziemienia, ale progami przełączania obwodów wejściowych), powstały strumień bitów będzie miał mocne odchylenie w kierunku 1 lub 0. To odchylenie wypacza nasiona znacznie silniej niż wypaczenie w poziomach analogowych.
Zajmie to bardzo mało sprzężenia, pochodzącego z pobliskich śladów lub sygnałów, lub poprzez rezystancyjne podciąganie / opuszczanie, niezależnie od tego, czy jest zaprojektowane, czy przypadkowe, aby wypchnąć „pływający” pin cyfrowy na powierzchnię - i równie dobrze może to nastąpić po rozlokowanie. W inżynierii każdego projektu najlepiej unikać tej formy trybu awarii.
źródło
Dane zmiennoprzecinkowe są niezdefiniowane. Może dać ci losowe bity, ale może również utknąć na 0 lub 1. W większości przypadków utknie. A gdy jest naprawdę pływający, może powodować zwiększony hałas i zużycie energii. Pływające wejścia są generalnie złą rzeczą, nawet jeśli nie są używane do niczego.
źródło
Najprostszym rozwiązaniem jest zbudowanie sprzętowego obwodu generatora sygnałów losowych z niewłaściwie wykorzystywanego obwodu tranzystora z otwartym kolektorem. Użyj wyjścia strumienia bitów do wejścia mikrokontrolera. Próbkuj przychodzące bity w odstępach czasu. Aby zapewnić z grubsza parzystą liczbę 1 i 0, wystarczy użyć zmiany stanu jako 1, a bez zmiany jako zero. Google dla generatora szumów tranzystorowych, aby uzyskać więcej informacji.
źródło
Jednym losowym generatorem, który jest dostępny w wielu mikrokontrolerach, jest błąd między dwoma źródłami zegara (być może jednym wewnętrznym a drugim zewnętrznym). Porównując je, dryfują nieco z powodu hałasu i można ich użyć.
W końcu to zależy od tego, czego potrzebujesz? Trochę randomizacji i możesz nawet użyć wtyku ADC podłączonego do niczego. Lub po prostu użyj algorytmu takiego jak
Mersenne twister http://en.wikipedia.org/wiki/Mersenne_twister
Brak, jeśli jest to kryptograficznie bezpieczne, ale wystarczające do większości celów.
źródło
Jakość losowego materiału siewnego i jego algorytmu zależy od wielkości entropii lub niepewności w każdym losowym bicie. Wtedy najlepszy generator nasion używa wysokiej entropii z bardzo małą liczbą kroków, a nie wieloma stopniami niskiej entropii.
Dobry przykład wysokiej entropii wykorzystuje metodę Latin Squares dla losowego materiału siewnego.
Swobodny sygnał wejściowy jest łatwo odchylany przez wady, wycieki lub hałas wnikający.
źródło
W mikroprocesorze PIC18F musisz mieć ziarno dla liczby losowej. Ziarno może mieć wartość od 0 do 32767 (15 bitów). Proponuję na początku programu zrobić jeden z pinów i analogowy pin wejściowy. Przeczytaj ten pin i weź najmniej znaczący bit i umieść go w zmiennej 16-bitowej. Następnie przesuń zmienną w lewo o 1. Ponownie przeczytaj pin i umieść LSB wyniku ADC w pierwszym bicie zmiennej, w której zapisałeś ostatni bit. Przesuń ponownie w lewo .....
Powtarzaj to, dopóki nie będziesz mieć 15 bitów w swojej zmiennej. Jest to liczba, którą musisz umieścić w swoim nasieniu.
Po wykonaniu tej czynności możesz po prostu uczynić analogowy pin wejściowy cyfrowym pinem wejściowym i umożliwić słabe podciągnięcie go lub uczynić go cyfrowym pinem wyjściowym. Każdy z nich powstrzyma ten pin od unoszenia się.
źródło