Die kurze Antwort
Ein Computer führt Anweisungen exakt aus, er kann also keinen Zufall aus dem Nichts erfinden. Entweder berechnet er Zahlen, die statistische Zufallstests bestehen (ein Pseudozufallszahlengenerator, kurz PRNG), oder er misst etwas physikalisch Unvorhersehbares und verarbeitet es (eine echte oder Hardware-Zufallsquelle). Moderne Systeme kombinieren beides: Das Betriebssystem sammelt unvorhersehbares Rauschen und nutzt es als Seed für einen kryptografisch sicheren PRNG (CSPRNG), der dann so viele Zahlen liefert wie nötig.
Der Generator auf dieser Seite nutzt die sichere Quelle des Browsers über die Web Crypto API und rechnet sie ohne Verzerrung auf deinen Bereich um. Gib ein Minimum und ein Maximum ein, wähl unter Wie viele die Anzahl und drück auf Erzeugen.
Hier ausprobieren: Zufallszahlengenerator
Vollständige Tool-Seite öffnenPseudozufallsgeneratoren und Seeds
Ein PRNG hat einen inneren Zustand. Jedes Mal, wenn du eine Zahl anforderst, verwürfelt er den Zustand mit einer festen Formel und gibt einen Teil des Ergebnisses aus. Die einfachste klassische Bauart, der lineare Kongruenzgenerator, berechnet den nächsten Zustand als (a mal Zustand plus c) modulo m. Bessere Verfahren wie der Mersenne-Twister (Standard im random-Modul von Python) oder die Xorshift-Familie liefern deutlich hochwertigere Folgen, und der Mersenne-Twister wiederholt sich erst nach 2 hoch 19.937 minus 1 Schritten.
Der Seed ist der Startzustand. Derselbe Seed ergibt immer dieselbe Folge. Das ist in vielen Fällen kein Fehler, sondern gewollt: Eine Forscherin kann eine Simulation exakt wiederholen, ein Spiel kann eine ganze Welt aus einem kurzen Seed-Code neu aufbauen, und ein Test kann einen Bug reproduzieren. Nimmt ein Programm aber etwas Erratbares als Seed, etwa die aktuelle Uhrzeit in Sekunden, kann ein Angreifer jeden wahrscheinlichen Seed ausprobieren und die Zahlen nachbilden.
Pseudozufall und kryptografisch sicherer Zufall im Vergleich
Schnelle Allzweck-PRNGs sind statistisch gut, aber vorhersagbar: Wer genug Ausgaben beobachtet, kann den inneren Zustand rekonstruieren und jede folgende Zahl vorhersagen. Für einen Partikeleffekt in einem Spiel ist das in Ordnung, für ein Passwort, eine Verlosung oder ein Sicherheitstoken nicht.
| Typ | Woher die Zahlen kommen | Vorhersagbar? | Typischer Einsatz |
|---|---|---|---|
| Einfacher PRNG (LCG, Xorshift, Mersenne-Twister) | Eine Formel und ein Seed | Ja, aus dem Seed oder aus genug Ausgaben | Simulationen, Spiele, Grafik |
| CSPRNG | Eine Formel, die mit Systemrauschen gestartet und aufgefrischt wird | Nein, nicht in der Praxis | Passwörter, Schlüssel, Verlosungen, Tokens |
| Hardware-Zufallsgenerator | Physikalisches Rauschen, etwa thermisches oder zeitliches Zittern | Nein | Füttert den Zufallspool des Betriebssystems |
Woher Computer echten Zufall bekommen
Betriebssysteme sammeln kleine unvorhersehbare Ereignisse: den genauen Zeitpunkt von Interrupts, Festplatten- und Netzwerkaktivität und eigene Hardware-Generatoren, die in viele moderne Prozessoren eingebaut sind und elektrisches Rauschen abtasten. Diese Entropie wird in einen Pool gemischt und dient dazu, einen CSPRNG zu starten und regelmäßig neu zu füttern. Linux stellt sie über getrandom und /dev/urandom bereit, Windows über seine Kryptografie-Funktionen.
Manche Dienste gehen aus Werbegründen oder für zusätzliche Sicherheit noch weiter. Random.org nutzt atmosphärisches Funkrauschen, und Cloudflare filmt bekanntlich eine Wand voller Lavalampen als eine seiner Entropiequellen. Für alltägliche Zwecke ist der Generator des Betriebssystems schon stark genug für Verschlüsselungsschlüssel.
Wie Browser sichere Zufallszahlen erzeugen
JavaScript bietet zwei Möglichkeiten. Math.random() liefert eine Zahl zwischen 0 und 1 aus einem schnellen PRNG (aktuelle Engines nutzen Verfahren nach Art von Xorshift). Für Animationen ist das in Ordnung, aber es ist nicht darauf ausgelegt, unvorhersehbar zu sein, und die Spezifikation gibt keinerlei Sicherheitsversprechen.
crypto.getRandomValues() füllt ein Array mit Zufallsbytes aus dem CSPRNG des Browsers, der vom Betriebssystem gestartet wird. Die Funktion gibt es in jedem modernen Browser, sie funktioniert offline und ist das, was Passwortgeneratoren und Code zur Schlüsselerzeugung verwenden sollten. Ein einzelner Aufruf liefert höchstens 65.536 Bytes, große Aufgaben rufen sie deshalb mehrfach auf. Dieser Generator nutzt crypto.getRandomValues, genauso wie Münzwurf, Würfel, Glücksrad und Namensauswahl auf Anyfeat.
Warum rand() % n verzerrt sein kann
Ein Generator liefert Rohwerte in einem festen Bereich, zum Beispiel ein Byte von 0 bis 255. Der naheliegende Weg zu einer Zahl von 0 bis 5 ist der Rest nach der Division durch 6 (Wert % 6). Das Problem: 256 Werte lassen sich nicht gleichmäßig auf 6 Gruppen verteilen. 256 ist 42 mal 6 plus 4, also kommen die Reste 0 bis 3 je 43 Mal vor und die Reste 4 und 5 nur 42 Mal. Manche Ergebnisse sind damit etwa 2,4 % wahrscheinlicher als andere. Das nennt man Modulo-Verzerrung (modulo bias).
Mit 32-Bit-Werten und einem kleinen Bereich wird die Verzerrung winzig, bei großen Bereichen wächst sie aber. Die übliche Lösung ist das Verwerfungsverfahren (rejection sampling): Man sucht das größte Vielfache von n, das in den Rohbereich passt (252 im Byte-Beispiel), wirft jeden Rohwert ab dieser Grenze weg und zieht neu. Alle übrigen Werte verteilen sich gleichmäßig auf den Bereich. Dieser Generator zieht 32-Bit-Werte und verwirft den ungleichen Rest, jede Zahl in deinem Bereich hat also genau dieselbe Wahrscheinlichkeit.
Ein ähnlicher Fehler ist Math.floor(Math.random() * n) für sicherheitsrelevante Zwecke. Das Runden ist für die meisten Bereiche in Ordnung, aber die Quelle ist vorhersagbar, sie gehört also nicht in Passwörter oder Verlosungen, bei denen es um Geld geht.
Zahlen ohne Wiederholung, Mischen und typische Fallen
- Zahlen ohne Wiederholung: Um ohne Doppelte zu ziehen, mischst du den ganzen Bereich mit dem Fisher-Yates-Verfahren und nimmst die ersten k Werte, oder du ziehst und verwirfst Wiederholungen. Genau das macht dieser Generator, wenn Ohne Wiederholung angehakt ist, und er sagt dir, wenn der Bereich für die Anzahl zu klein ist.
- Verzerrtes Mischen: Eine Liste mit einer zufälligen Vergleichsfunktion zu sortieren ergibt keine gleichmäßige Mischung. Nimm Fisher-Yates.
- Zu häufiges Neustarten: Wer einen PRNG in einer Schleife immer wieder mit der Uhrzeit startet, kann viele Male hintereinander dieselbe Zahl bekommen.
- Kommazahlen: Eine zufällige Kommazahl durch Skalieren eines zufälligen Bruchs zu wählen kann die Endpunkte seltener machen. Dieses Tool zieht stattdessen eine ganze Zahl von Schritten (bei 2 Nachkommastellen Hundertstel), sodass beide Enden mit gleicher Chance vorkommen.
- Erwarten, dass es keine Muster gibt: Echter Zufall enthält Serien und Wiederholungen. Zweimal hintereinander eine 7 ist kein Zeichen für einen kaputten Generator.