568 Stimmen

Einsetzen des Zufallszahlengenerators in Javascript

Ist es möglich, den Zufallszahlengenerator ( Math.random ) in JavaScript?

12voto

user2383235 Punkte 129

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

7voto

user3158327 Punkte 69

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();

6voto

Lajos Bodrogi Punkte 51

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.

3voto

Ulf Aslak Punkte 6808

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)

2voto

Martin Omander Punkte 2719

Viele Leute, die einen Zufallszahlengenerator in Javascript benötigen, verwenden heutzutage David Bau's Seedrandom-Modul .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X