Ist es möglich, den Zufallszahlengenerator ( Math.random
) in JavaScript?
Antworten
Zu viele Anzeigen?Bitte beachten Sie die Arbeiten von Pierre L'Ecuyer aus den späten 1980er und frühen 1990er Jahren. Es gibt auch noch andere. Einen (Pseudo)-Zufallszahlengenerator selbst zu erstellen, ist ziemlich gefährlich, wenn man kein Experte ist, denn es besteht eine hohe Wahrscheinlichkeit, dass die Ergebnisse entweder nicht statistisch zufällig sind oder eine kleine Periode haben. Pierre (und andere) haben einige gute (Pseudo-)Zufallszahlengeneratoren entwickelt, die leicht zu implementieren sind. Ich verwende einen seiner LFSR-Generatoren.
https://www.iro.umontreal.ca/~lecuyer/myftp/papers/handstat.pdf
Phil Troy
Kombiniert man einige der vorangegangenen Antworten, ist dies die gesuchte Zufallsfunktion:
Math.seed = function(s) {
var mask = 0xffffffff;
var m_w = (123456789 + s) & mask;
var m_z = (987654321 - s) & mask;
return function() {
m_z = (36969 * (m_z & 65535) + (m_z >>> 16)) & mask;
m_w = (18000 * (m_w & 65535) + (m_w >>> 16)) & mask;
var result = ((m_z << 16) + (m_w & 65535)) >>> 0;
result /= 4294967296;
return result;
}
}
var myRandomFunction = Math.seed(1234);
var randomNumber = myRandomFunction();
Einen eigenen Pseudo-Zufallsgenerator zu schreiben ist recht einfach.
Der Vorschlag von Dave Scotese ist nützlich, aber, wie von anderen bemerkt, nicht ganz gleichmäßig verteilt.
Das liegt aber nicht an den ganzzahligen Argumenten der Sünde. Es liegt einfach an dem Bereich von sin, der zufällig eine eindimensionale Projektion eines Kreises ist. Wenn man stattdessen den Winkel des Kreises nehmen würde, wäre es gleichmäßig.
Verwenden Sie also anstelle von sin(x) arg(exp(i * x)) / (2 * PI).
Wenn dir die lineare Reihenfolge nicht gefällt, kannst du sie mit xor ein wenig durcheinander bringen. Der eigentliche Faktor ist auch nicht so wichtig.
Um n Pseudozufallszahlen zu erzeugen, könnte man den Code verwenden:
function psora(k, n) {
var r = Math.PI * (k ^ n)
return r - Math.floor(r)
}
n = 42; for(k = 0; k < n; k++) console.log(psora(k, n))
Bitte beachten Sie auch, dass Sie keine Pseudo-Zufallsfolgen verwenden können, wenn echte Entropie benötigt wird.
Math.random
nein, aber die lief Bibliothek löst dieses Problem. Es hat fast alle Verteilungen, die man sich vorstellen kann, und unterstützt die Erzeugung von Zufallszahlen mit Seed. Beispiel:
ran.core.seed(0)
myDist = new ran.Dist.Uniform(0, 1)
samples = myDist.sample(1000)
Viele Leute, die einen Zufallszahlengenerator in Javascript benötigen, verwenden heutzutage David Bau's Seedrandom-Modul .