Daves Antwort setzt es ganz nett fort, aber um ein bisschen mehr über die zweite Option zu klären:
Ein realer Hardware-Zufallszahlengenerator verwendet eine physikalische Entropiequelle. Eine solche Entropiequelle könnte kosmische Strahlung, elektrisches Rauschen, Avanlancheeffekt einer in Sperrrichtung vorgespannten Diode (oder BJT-Transistor), Chua-Schaltung usw. sein. Je weniger deterministisch die Entropiequelle ist, desto besser ist die Qualität der Zufallsausgabe. Eine ideale Entropiequelle wäre die Verwendung eines quantenphysikalischen Effekts oder etwas, das unmöglich mit deterministischen Gleichungen modelliert werden kann.
Ein weiterer wichtiger Faktor bei Zufallszahlengeneratoren ist, dass die Entropiequelle möglicherweise nur eine begrenzte Menge an Entropie pro Zeiteinheit erzeugt. Ein gutes Beispiel ist die Chua-Schaltung: Obwohl sie ziemlich zufällig ist, hat sie eine sehr schlechte Geschwindigkeit und kann möglicherweise nicht für reale Anwendungen verwendet werden.
In vielen Prozessoren / Mikrocontrollern mit eingebauten RNGs wird die Taktverschiebung von 2 auf 4 Takte verwendet, die absichtlich falsch synchronisiert sind. Dann verwenden sie sowohl analoge als auch digitale Filter, um das Muster noch weiter zu randomisieren und das Ergebnis in ein Register zu verschieben. Das Durchführen einer solchen Filterung erfordert einige Zyklen, was die minimale Anzahl von Zyklen erklärt, die für einen bestimmten Takt erforderlich sind, bevor der neuere Wert verfügbar ist.
Die Taktverschiebung ist kein Quanteneffekt, daher könnte sie modelliert werden, ist jedoch zufällig genug, da sie von vielen Parametern abhängt, wie z. B. Temperatur, Siliziumprozess, Betriebsfrequenz, elektrisches Rauschen, Hintergrundstrahlung usw. .
In Anwendungen, in denen das Hardware-RNG nicht über einen ausreichenden Durchsatz verfügt (z. B. in sehr anspruchsvollen kryptografischen Anwendungen), wird das Hardware-RNG häufig als Startwert für einen Pseudozufallszahlengenerator wie die Funktion rand () in der sdtlib verwendet. Eine solche Anwendung bietet jedoch normalerweise eine bessere Implementierung von rand (), das speziell für die Ausführung mit einem Startwert ausgelegt ist, der sehr oft mit echten Zufallswerten verworfen werden kann. In neueren Intel-Prozessoren mit integrierten Hardware-RNGs ist der Pseudozufallsalgorithmus-Teil direkt in das Silizium integriert, sodass er von der Hardware ausgeführt wird, was einen sehr hohen Zufallsdurchsatz ergibt.
Wenn Sie sich für die rand () -Methode selbst interessieren, handelt es sich nur um einen methematischen Ausdruck, der eine ausreichend große Entropiemenge erzeugen soll. Groß genug, um von der Anwendung abhängig zu sein: Für Generationen von kryptografischen Schlüsseln muss die Zufälligkeit von höherer Qualität sein als die Zufälligkeit, die für ein einfaches zufälliges Mischen in Ihrem Lieblingsmusik-Player erforderlich ist. Es ist offensichtlich, dass die Berechnungskosten der Zufallszahl umso höher sind, je höher die Qualität der Zufallsausgabe ist.
Die Operationen, die an einer Zufallszahl beteiligt sind, sind denen bei der Berechnung des MD5-Hash einer Datei ziemlich ähnlich: Sie versuchen, eine Art Bitlawineneffekt zu verwenden, so dass eine einzelne Bitänderung in einem Startwert das gesamte Erzeugungsmuster ändert. Als Randnotiz empfehle ich NICHT, MD5 als Pseudozufallszahlengenerator zu verwenden. es war nur ein Beispiel. Es wäre sowohl ineffizient als auch nicht so zufällig, aber der Punkt ist da: Wenn Sie dieselbe Datei einem MD5-Hashing-Algorithmus zuführen, erhalten Sie immer dieselbe deterministische Ausgabe, so ziemlich die gleiche Art und Weise, wie Sie immer dieselbe Ausgabe erhalten würden Die Funktion rand (), wenn Sie denselben Startwert eingeben, es sei denn, Ihre Implementierung hängt von beliebigen Elementen wie der aktuellen Zeit ab.