Sie drücken eine Taste, eine Zahl erscheint, und sie gilt als zufällig. Die Frage, die sich lohnt, ist, was sie erzeugt hat — denn eine der beiden Antworten ist überprüfbar und die andere nicht.
Woher echte Zufälligkeit kommt
Echte Zufälligkeit stammt aus physikalischen Prozessen, die nicht durch einen vorherigen Zustand bestimmt sind:
- Radioaktiver Zerfall — der genaue Moment, in dem ein Atom zerfällt, lässt sich nicht vorhersagen
- Thermisches Rauschen — zufällige Spannungsschwankungen in einem Widerstand
- Atmosphärisches Rauschen — das Hintergrundrauschen der Blitzaktivität
- Quantenmessung — Ergebnisse, die wirklich unbestimmt sind
Das sind keine Annäherungen an Zufälligkeit. Sie sind zufällig in dem Sinn, dass noch so viel Wissen über die Vergangenheit das Ergebnis nicht bestimmt.
Was ein Computer stattdessen tut
Ein Computer kann nichts davon direkt beobachten, deshalb tastet ein Hardware-Generator sie ab. Die rohen Bytes stammen aus etwas wie /dev/urandom oder der entsprechenden Quelle des Betriebssystems, die selbst aus physikalischen Prozessen gespeist wird. Das ist ein echter Zufallszahlengenerator.
Der weit häufigere Fall ist ein Pseudozufallszahlengenerator: ein deterministischer Algorithmus, der eine Sequenz erzeugt, die lediglich zufällig aussieht.
next = (previous × multiplier + increment) mod modulus
Die entscheidende Eigenschaft ist nicht subtil. Wenn Sie den Algorithmus und den Seed kennen, können Sie jeden Wert berechnen, den die Sequenz jemals erzeugen wird. Nicht ungefähr — genau.
Deshalb ist Math.random(), das fast jede Website verwendet, für alles Wichtige ungeeignet. Seine Ausgabe wird durch den internen Zustand bestimmt. Rekonstruieren Sie diesen Zustand aus beobachteten Ausgaben, wird jeder künftige Wurf vorhersagbar.
Das am häufigsten zitierte Beispiel ist, dass sich der vollständige Zustand eines linearen Kongruenzgenerators aus einer Handvoll aufeinanderfolgender Ausgaben rekonstruieren lässt. Der Mersenne Twister, der Standard in Python, braucht 624 Ausgaben zur Rekonstruktion — und 624 ist eine Zahl, die Sie in Sekunden erreichen.
Xorshift und ähnliche schnelle Generatoren haben dieselbe Eigenschaft in anderer Form: ausgezeichnete statistische Qualität, völlig vorhersagbar, wenn man den Zustand kennt.
Der Mittelweg, auf den es wirklich ankommt
Das ist der Teil, den die meisten Erklärungen überspringen, und der Teil, der die Antwort in der Praxis entscheidet.

Moderne Webplattformen verwenden nicht bei jedem Aufruf rohes /dev/urandom. Sie verwenden einen kryptografisch sicheren PRNG — einen deterministischen Algorithmus, aber gespeist aus Hardware-Entropie und so gestaltet, dass das Beobachten von Ausgaben keinen Rückschluss auf den Zustand erlaubt.
Die Unterscheidung verdient Genauigkeit, weil beides oft verwechselt wird:
| Hardware-TRNG | CSPRNG | Gewöhnlicher PRNG | |
|---|---|---|---|
| Basiert auf physikalischer Entropie | Ja | Ja | Nein |
| Deterministisch bei gegebenem Zustand | Nein | Ja | Ja |
| Ausgabe verrät den Zustand | Nein | Nein | Ja |
| Geeignet für eine Preisziehung | Ja | Ja | Nein |
Ein CSPRNG ist in demselben Sinn deterministisch, in dem jede Software, die Sie verwenden, deterministisch ist. Akzeptabel macht ihn, dass der Zustand aus dem, was er bereits ausgegeben hat, nicht rekonstruierbar ist.
Browser stellen genau das über crypto.getRandomValues() bereit. Das ist die Quelle, aus der RandomSelect zieht.
Fairness ist eine zweite Frage
Gleichverteilung ist selbst mit einer guten Quelle leicht falsch umzusetzen. Ein W6 ist unkompliziert: sechs gleich wahrscheinliche Werte. Ein W7 ist es nicht, und „1 von 40 Namen wählen” ebenso wenig.
Der naive Ansatz — eine Zufalls-Gleitkommazahl von 0 bis 1 auf den Bereich skalieren — verzerrt das untere Ende. Bei 40 Namen würde der erste etwas häufiger auftauchen als der letzte, weil einige Zufallswerte hinter das Ende des letzten Bereichs fallen und ungleichmäßig verworfen werden.
Der richtige Ansatz ist Rejection Sampling: ziehen, und wenn das Ergebnis in den unvollständigen letzten Bereich fällt, verwerfen und erneut ziehen. Die Verteilung wird exakt gleichmäßig.
Das ist leicht zu übersehen, weil die Verzerrung klein ist. In der Praxis verwirft die Implementierung Werte außerhalb des Bereichs und zieht erneut, sodass jeder Eintrag genau eine 1/N-Chance hat — auch bei einer Ziehung mit 40 Namen, bei der eine skalierende Gleitkomma-Implementierung dem ersten Namen eine minimal höhere Wahrscheinlichkeit gäbe.
Dieselbe Technik erscheint im Kurz-ID-Generator, wo der Kommentar im Code die Akzeptanzrate und die daraus resultierende Verzerrung von etwa zwei zu zehn Millionen festhält. Klein genug, um irrelevant zu sein, und klein genug, dass eine nachlässige Implementierung unbemerkt geblieben wäre — was genau der Sinn des Messens ist.
Was das in der Praxis bedeutet
Für die Wahl eines Mittagessens spielt nichts davon eine Rolle. Jeder Generator liefert ein akzeptables Mittagessen.
Bei einer Preisziehung, einer Mitarbeiterzuteilung oder irgendetwas, an dem ein Ruf hängt, ist die Frage, ob die Ausgabe hätte vorhergesehen werden können. Mit Math.random() könnte sie es im Prinzip. Mit crypto.getRandomValues() kann sie es nicht — das ist der Unterschied zwischen „wir sagen, es war zufällig” und „der Mechanismus macht es dazu”.
Es gibt einen verwandten und häufig verwechselten Punkt zur Animation. Bei einem sich drehenden Rad steht das Ergebnis fest, bevor sich das Rad zu drehen beginnt; die Animation läuft darauf zu. Manche Leser nehmen das als Beweis für Manipulation. Es ist das Gegenteil: Weil das Ergebnis bereits feststeht und nicht durch das Timing beeinflusst werden kann, gibt es keinen Ansatzpunkt, den jemand ausnutzen könnte. Das Visuelle ist Theater über einem bereits feststehenden Wert.
Selbst testen
Eine schnelle Übung ohne Code: Würfeln Sie zwanzig Mal und schreiben Sie die Ergebnisse auf. Suchen Sie dann nach Serien.
Sie werden sie finden. Drei Sechsen hintereinander kommen etwa einmal in fünfzig Würfen vor. Das ist kein Zeichen für einen gezinkten Würfel — so sieht ein fairer Prozess aus, wenn Sie eine kurze Stichprobe betrachten.
Würfeln Sie dann hundert Mal und zählen Sie jede Seite. Die Abweichungen werden kleiner. Niemand gleicht sich an, denn es gab nie ein Defizit auszugleichen: Das bedeutet Unabhängigkeit, wenn man genau genug hinsieht.
Wo Sie mehr lesen können
Die Fairness-Seite auf dieser Website führt durch die tatsächliche Implementierung, einschließlich des Rejection-Sampling-Schritts. Sie ist einmal lesenswert, besonders wenn Sie ein Tool für eine Entscheidung wählen, die infrage gestellt wird.
Die praktische Zusammenfassung ist kurz: Ein Tool, das crypto.getRandomValues() verwendet und Ziehungen außerhalb des Bereichs verwirft, macht das Richtige, und Sie müssen es nicht einfach glauben — Sie können stattdessen über den Mechanismus nachdenken.