JavaScript-Engine V8: Vorsicht vor Math.random()

Der Zufallszahlengenerator Math.random() in der JavaScript-Engine V8 liefert nicht ganz so zufällige Zahlen, wie es wünschenswert wäre. Er ist unter anderem im Browser Chrome im Einsatz.

In Pocket speichern vorlesen Druckansicht 170 Kommentare lesen
Lesezeit: 2 Min.
Von
  • Dr. Harald Bögeholz

Zufallszahlen zu erzeugen ist eine hohe Kunst. Im zweiten Band seines Buchs The Art of Computer Programming zitiert Informatik-Papst Donald E. Knuth John von Neumann mit den Worten "Any one who considers arithmetical methods of producing random digits is, of course, in a state of sin."

Maschinen, die eine endliche Menge von Zuständen annehmen können, können prinzipbedingt immer nur Pseudo-Zufallszahlen erzeugen. Hinzu kommt, dass man bei der Programmierung von (Pseudo-)Zufallsgeneratoren allerlei falsch machen kann. Und wie sich jetzt wieder einmal zeigt, ist man auch beim Aufruf von System-Funktionen nicht auf der sicheren Seite.

In seinem Blog-Beitrag TIFU by using Math.random() [Anm. d. Red.: TIFU steht für Today I Fucked Up, heute habe ich Mist gebaut] warnt Mike Malone vor dem Gebrauch der JavaScript-Funktion Math.random(). In der JavaScript-Engine V8, die unter anderem im Browser Chrome im Einsatz ist, verwendet Math.random() den Algorithmus MWC1616. MWC steht für Multiply With Carry, eine Klasse von Pseudo-Zufallsalgorithmen, die der amerikanische Mathematiker George Marsaglia erfunden hat. MWC1616 kombiniert aber zwei solcher Generatoren – in ungeschickter Weise, wie sich jetzt herausgestellt hat. Das führt dazu, dass sich mit dieser Funktion erzeugte "zufällige" Identifier wesentlich schneller wiederholen, als man denkt.

Mehr Infos

Many random number generators in use when this chapter was first written were not very good. People have traditionally tended to avoid learning about such subroutines; old methods that were comparatively unsatisfactory have been passed down blindly from one programmer to another, until the users have no understanding of the original limitations.

Donald E. Knuth, The Art of Computer Programming, Volume 2, Seminumerical Algorithms, Third Edition

Details sind im oben zitierten Blog-Beitrag nachzulesen, aber Malone hat das Problem auch schön veranschaulicht. Unter der Adresse http://bl.ocks.org/mmalone/bf59aa2e44c44dde78ac kann man eine Seite mit JavaScript-Code aufrufen, die Rauschen produzieren sollte. Tut man dies mit Chrome, kann man deutliche Muster erkennen, während dieselbe Seite etwa in Safari oder Firefox wirklich nach zufälligem Rauschen aussieht. (bo)