Blatt · Zufall

Würfel: wie zufällig ist zufällig?

Ein schlechter Zufallsgenerator sieht aus wie ein guter. Die Zahlen wirken wirr, der Mittelwert stimmt, die Verteilung ist flach — und trotzdem liegen sie in Wahrheit auf wenigen Ebenen. Man sieht es erst, wenn man je drei aufeinanderfolgende Zahlen als Punkt im Raum aufträgt und den Würfel dreht. Dann klappen die Ebenen auf einmal auf.

Generator Startwert Punkte bereit
Der Würfel — je drei Zahlen ein Punkt ziehen zum Drehen
Flächenbild — je zwei Zahlen ein Punkt

Anteil gesetzter Bits je Position · Soll 0,5

Chi-Quadrat
Soll 255 ± 23
Serielle Korrelation
Soll ≈ 0
Fläche gefüllt
64 × 64 Felder
Würfel gefüllt
24³ Felder
Bit-Auffälligkeit
größte Abweichung
Periode
bis Wiederholung

Warum drei Dimensionen

RANDU war jahrzehntelang auf IBM-Großrechnern in Gebrauch und besteht jeden einfachen Test: die Verteilung ist flach, die Korrelation null, das Flächenbild makellos. Erst im Raum zeigt sich, dass alle Punkte auf 15 Ebenen liegen. Dreh den Würfel, bis sie einrasten — der Moment ist ziemlich unangenehm.

Mein eigener Fehler

Der Eintrag „LCG, kaputt“ ist kein Strohmann, sondern ein Fehler, den ich zweimal ausgeliefert habe: seed * 1103515245 überschreitet in JavaScript 2⁵³. Das Produkt wird gerundet, und ausgerechnet die unteren Bits, die man danach abschneidet, sind der gerundete Rest. Chi-Quadrat 5118 statt 255.

Was die Zahlen bedeuten

Chi-Quadrat prüft, ob alle 256 Bytewerte gleich häufig sind — bei echtem Zufall liegt es nahe 255. Serielle Korrelation misst, ob eine Zahl die nächste verrät. Gitterfüllung zählt, welcher Anteil aller Felder überhaupt getroffen wird; wer Ebenen bildet, lässt große Bereiche leer.

Wofür das reicht

Diese Tests finden grobe Schnitzer, nicht Schwäche gegen einen Angreifer. Ein Generator kann alles hier bestehen und trotzdem vorhersagbar sein — mulberry32 etwa ist gut für Simulationen und völlig ungeeignet für Schlüssel. Dafür gibt es crypto.getRandomValues, und dafür braucht es andere Prüfungen.