Nach diesem Stapelüberlauf-Thread , Math.random () in JavaScript hängt vom Browser oder Betriebssystem ab. Grundsätzlich bedeutet dies, dass JavaScript keinen Standardalgorithmus zum Generieren einheitlicher Zufallsvariablen besitzt. Dieser Thread scheint das zu vermuten Der Algorithmus für die Zufallszahlenverteilung von Chrome ist besonders schlecht.
In meinem Programm versuche ich zu verstehen, wie sich der Benutzer aufgrund einiger Informationen und zufälligem Rauschen verhält. Ich verwende eine Box-Muller-Transformation für Zahlen, die von Math.random () generiert wurden, um Gaußsche Zufallszahlen zu erzeugen. Bedeutet dies, dass Benutzer, die einen Browser verwenden, verschiedene Arten von Lärm empfinden werden als andere? Hinweis: Ich benutze Box Muller, weil mir die Geschwindigkeit egal ist, aber ich weiß, dass sie besonders empfindlich auf die Pseudozufallszahlen reagieren kann. Es scheint viele Threads darüber zu geben, warum Math.random () schlecht ist, aber nicht so sehr innerhalb des Threads, was stattdessen verwendet wird. Was ist die beste Praxis? Gibt es etwas, auf das ich besonders achten sollte, weil ich Box-Muller verwende, um zu Gaußschen Zahlen zu konvertieren?
Auf Ссылка gibt es einen xor-shift-basierten Zufallszahlengenerator mit guten Zufälligkeitseigenschaften, die relativ einfach nach JavaScript portieren sollten:
BEARBEITEN done:
%Vor%Hinweis: Dies verwendet nur 32 Bits der 128, die generiert wurden, um das Gleitkommaergebnis zu erzeugen. Theoretisch könnten Sie weitere 20 Bits von einer der anderen Zustandsvariablen kombinieren, um 52 Ergebnisbits zu erzeugen.
Das wichtigste Problem dabei ist, dass das Seeding nicht unterstützt wird - es wird immer die gleiche Sequenz erzeugen.
Eine Box-Muller Transformation funktioniert nur bei gleichmäßig verteilt Eingang. Laut MDN (letztes Beispiel) wird Math.random()
generiere keine gleichmäßig verteilten Zahlen.
Die ECMAScript-Spezifikation sagt Folgendes über Math.random()
:
Gibt einen Zahlenwert mit positivem Vorzeichen, größer als oder gleich 0 aber kleiner als 1, zufällig oder pseudozufällig mit einer ungefähr gleichmäßigen Verteilung über diesen Bereich unter Verwendung eines implementierungsabhängigen Algorithmus oder einer Strategie zurück . Diese Funktion benötigt keine Argumente.
Also, es liegt an dem Browser. Ein Browser kann, muss aber nicht, einen vollkommen gleichmäßig verteilten Zufallszahlengenerator implementieren.
Sie können daher eine Browser-übergreifende Box-Muller-Transformation in Javascript auf der Browserseite nicht zuverlässig mit Math.random()
Tags und Links javascript random