Blatt · Zufall
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.
—
Anteil gesetzter Bits je Position · Soll 0,5
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.
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.
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.
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.