Wie funktionieren Zufallszahlengeneratoren?

Die meisten Zufallszahlengeneratoren sind Formeln: Sie beginnen mit einem Startwert, dem sogenannten Seed, und wenden immer wieder dieselbe Rechnung an. So entsteht eine Folge, die zufällig aussieht, aber vollständig von diesem Seed bestimmt ist. Kryptografisch sichere Generatoren mischen unvorhersehbare Eingaben hinzu, die das Betriebssystem sammelt, etwa zeitliches Rauschen der Hardware. Ihre Ausgabe lässt sich deshalb selbst dann nicht vorhersagen, wenn jemand frühere Zahlen gesehen hat. Um aus diesen Rohzahlen ein faires „1 bis 6“ oder „1 bis 100“ zu machen, braucht es noch einen sorgfältigen Schritt, und genau dort machen viele einfache Programme Fehler.

6 Min. Lesezeit

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 öffnen

Pseudozufallsgeneratoren 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.

TypWoher die Zahlen kommenVorhersagbar?Typischer Einsatz
Einfacher PRNG (LCG, Xorshift, Mersenne-Twister)Eine Formel und ein SeedJa, aus dem Seed oder aus genug AusgabenSimulationen, Spiele, Grafik
CSPRNGEine Formel, die mit Systemrauschen gestartet und aufgefrischt wirdNein, nicht in der PraxisPasswörter, Schlüssel, Verlosungen, Tokens
Hardware-ZufallsgeneratorPhysikalisches Rauschen, etwa thermisches oder zeitliches ZitternNeinFü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.

Schritt für Schritt

  1. Bereich festlegenGib Minimum und Maximum ein. Beide Zahlen sind eingeschlossen.
  2. Anzahl wählenStell unter Wie viele 1 bis 10.000 ein und hak Ohne Wiederholung an, wenn jede Zahl anders sein muss.
  3. Format wählenWähl unter Nachkommastellen Ganze Zahlen oder bis zu 4 Nachkommastellen und hak Sortieren an, wenn du das Ergebnis geordnet willst.
  4. Erzeugen und kopierenDrück auf Erzeugen, die Eingabetaste oder die Leertaste und übernimm die Zahlen dann mit Kopieren.

Häufige Fragen

Sind Zufallszahlen vom Computer wirklich zufällig?

Nicht im physikalischen Sinn: Ein PRNG ist eine Formel. Ein kryptografisch sicherer Generator, der mit Hardware-Rauschen gestartet wird, ist in der Praxis aber unvorhersehbar, und genau das zählt bei Verlosungen, Spielen und Passwörtern.

Was ist ein Seed bei einem Zufallszahlengenerator?

Der Startwert des inneren Zustands. Derselbe Seed ergibt immer dieselbe Folge. Das ist praktisch für wiederholbare Simulationen und gefährlich, wenn ein Angreifer den Seed erraten kann.

Ist Math.random() sicher für Passwörter?

Nein. Es ist schnell, aber vorhersagbar. Nimm im Browser crypto.getRandomValues() und auf anderen Plattformen die jeweilige sichere Zufallsfunktion.

Ist dieser Zufallszahlengenerator fair?

Ja. Er nutzt crypto.getRandomValues und das Verwerfungsverfahren, jede Zahl im Bereich hat also genau dieselbe Chance, ohne Modulo-Verzerrung.

Schickt der Generator meine Zahlen an einen Server?

Nein. Alles läuft in deinem Browser und funktioniert offline, sobald die Seite geladen ist. Nichts, was du erzeugst, wird auf einem Server gespeichert.

Warum habe ich zweimal dieselbe Zahl bekommen?

Wiederholungen gehören zum Zufall. Im Bereich 1 bis 10 liegt die Chance, dass die nächste Zahl gleich der vorigen ist, bei 10 %. Hak Ohne Wiederholung an, wenn alle Zahlen verschieden sein müssen.