Odpowiedź Dave'a całkiem ładnie go wznowić, ale aby wyjaśnić nieco więcej na temat drugiej opcji:
prawdziwy sprzętowy generator liczb losowych wykorzystuje fizyczne źródło entropii. Takim źródłem entropii może być promieniowanie kosmiczne, szum elektryczny, efekt lawinowy diody (lub tranzystora BJT), obwód chua itp. Im mniej deterministyczne źródło entropii, tym lepsza jakość wyjścia losowego. Idealnym źródłem entropii byłoby zastosowanie efektu fizyki kwantowej lub czegoś, czego nie da się modelować równaniami deterministycznymi.
Innym ważnym czynnikiem z generatorami liczb losowych jest to, że źródło entropii może generować tylko ograniczoną ilość entropii na jednostkę czasu. Dobrym przykładem jest obwód chua: chociaż jest dość losowy, ma bardzo niską prędkość i nie może być wykorzystywany do rzeczywistych zastosowań.
W wielu procesorach / mikrokontrolerach z wbudowanymi RNG stosuje się przesunięcie zegara od 2 do 4 zegarów, które są celowo nieprawidłowo zsynchronizowane. Następnie używają filtrów analogowych i cyfrowych, aby jeszcze bardziej randomizować wzór i przesuwać wynik w rejestrze. Przeprowadzenie takiego filtrowania wymaga kilku cykli, co wyjaśnia minimalną liczbę cykli wymaganych na danym zegarze, zanim dostępna będzie nowsza wartość.
Dryfowanie zegara nie jest efektem kwantowym, więc może być modelowane, ale jest wystarczająco losowe, ponieważ zależy od wielu parametrów, takich jak temperatura, proces krzemowy, częstotliwość działania, szum elektryczny, promieniowanie tła itp. .
W aplikacjach, w których sprzętowy RNG nie ma wystarczającej przepustowości (np. W bardzo wymagających aplikacjach kryptograficznych), dość powszechne jest używanie sprzętowego RNG jako źródła dla generatora pseudolosowego liczb, takiego jak funkcja rand () w sdtlib. Jednak taka aplikacja zazwyczaj zapewnia lepszą implementację rand (), która jest specjalnie zaprojektowana do uruchamiania z zarodka, który może być bardzo często odrzucany z prawdziwymi losowymi wartościami. W nowszym procesorze Intel ze zintegrowanym sprzętowym RNG część pseudolosowa algorytmu jest bezpośrednio zintegrowana z krzemem, więc jest wykonywana sprzętowo, zapewniając bardzo wysoką losową przepustowość.
Jeśli masz na myśli samą metodę rand (), jest to tylko wyrażenie matematyczne, które ma na celu wygenerowanie wystarczająco dużej ilości entropii. Wystarczająco duży, zależny od aplikacji: w przypadku generacji kluczy kryptograficznych losowość musi być wyższej jakości niż losowość wymagana do zwykłego losowego losowania w ulubionym odtwarzaczu muzyki. Oczywiste jest, że im wyższa jakość losowego wyniku, tym wyższy koszt obliczeniowy liczby losowej.
Operacje związane z liczbą losową są bardzo podobne do operacji związanych z obliczaniem skrótu MD5 pliku: próbują użyć pewnego rodzaju efektu lawinowego, aby zmiana bitowa wartości początkowej zmieniła jeden wzorzec. Na marginesie, NIE polecam używania MD5 jako generatora liczb pseudolosowych; to był tylko przykład. Byłoby to zarówno nieefektywne, jak i nie tak losowe, ale chodzi o to: jeśli podasz ten sam plik algorytmowi MD5, zawsze uzyskasz to samo deterministyczne wyjście, prawie w ten sam sposób, w jaki zawsze uzyskasz takie samo wyjście funkcja rand (), jeśli wprowadzisz to samo ziarno, chyba że twoja implementacja zależy od niektórych dowolnych elementów, takich jak bieżący czas.
Dwa zarysowane tematy można stosunkowo łatwo opisać:
źródło
Załóżmy, że ktoś projektuje mechaniczną przędzarkę koła ruletki, która przez pewien czas zasila silnik, czeka, aż koło i kula zatrzymają się, i obserwuje, w której kieszeni znajduje się kula. Zwykle po każdym obrocie piłka i koło kończy się w nieco innym miejscu, a małe zmiany położenia piłki po jednym spinie mogą mieć ogromną różnicę w tym, gdzie kończy się przy kolejnym spinie. Tak więc, nawet jeśli silnik jest zawsze zasilany energią przez ten sam czas, kieszeń, w której kulka wyląduje na jednym spinie, będzie niezależna od miejsca, w którym wcześniej wylądowała.
Załóżmy jednak teraz, że kilka liczb ma lub rozwija się w nich niewielkie zagłębienie, a łożyska silnika mają płaskie plamki. Wtedy niektóre spiny byłyby losowe, ale po spinie, w wyniku którego piłka ląduje w zagłębieniu i łożysko w płaskiej pozycji, kolejny spin może być bardzo tendencyjny do uzyskania takiego samego wyniku jak ostatni obrót, w którym to miało miejsce. Jeśli większość spinów nie trafi jednocześnie w divot i płaskie miejsce, ich istnienie prawdopodobnie nie wpłynie zbytnio na rzeczy. Z drugiej strony, jeśli zdarzy się, że jedna kombinacja divot / flat zostanie umieszczona dokładnie tak, aby piłka mogła w rozsądny sposób wylądować na drugiej, i tak się złoży, aby odesłać piłkę z powrotem do pierwszej, następnie jedna kończą się wyjątkowo wypaczonymi zachowaniami.
Jeśli po wylądowaniu na 4 i 23, następny obrót to 4, niekoniecznie oznacza to problem. W takiej sytuacji 4 powinien pojawić się około 1/38 czasu. Ponadto, pozyskiwanie losowych danych powinno po prostu uchwycić numer kieszeni, ponieważ nic użytecznego nie wiadomo o tym, jak często piłka powinna spoczywać w różnych częściach kieszeni. Niemniej jednak przydaje się przy zapisywaniu liczb „obserwować”, gdzie w kieszeni zatrzymuje się kula i obserwować wszelkie nietypowe wzory. Rozkład lokalizacji może być przechylony do przodu lub do tyłu bez wskazywania problemu, ale jeśli występuje wąski skok w rozmieszczeniu, może to być powodem do niepokoju.
Jeśli kolejne odczyty z generatora losowego są statystycznie niezależne , kompensacja błędu systematycznego nie jest trudna (choć wymagany czas nie jest deterministyczny). Jeśli jednak generator wpadnie w stan, w którym odczyty nie są niezależne (np. Cykliczny stan koła powyżej), kompensacja staje się w zasadzie niemożliwa - stąd potrzeba, aby sprzętowy RNG obejmował zespół obwodów elektrycznych do wykrywania takich zachowań.
źródło