2010-02-26 6 views
17

Wie wird Zufälligkeit mit Math.random in Javascript erreicht? Ich habe etwas gemacht, das zufällig zwischen ungefähr 50 verschiedenen Optionen auswählt. Ich frage mich, wie bequem ich mit Math.random sein sollte, um meine Zufälligkeit zu bekommen.Wie wird Zufälligkeit mit Math.random in Javascript erreicht?

+2

@David: es ist nicht wahre Zufälligkeit, wie Sie wissen. John von Neumann zugeschrieben: "Wer die arithmetischen Methoden zur Produktion von Zufallszahlen in Betracht zieht, ist natürlich in einem Zustand der Sünde." * Sie benutzen einen PRNG. Pseudo-Zufallszahlengenerator. – cocotwo

+0

@cocotwo: das bedeutet nicht, dass alle JS pseudo-zufällig sein muss, aus der Spezifikation Bob unten, kann es wirklich zufällig sein. Es wäre nur Sache der Implementierung, einen echten RNG zu verwenden, der nicht so schwierig ist wie früher. –

+2

Wie einige Antworten unten sagen, hängt es wirklich davon ab, was Sie tun möchten. Ich vermute, dass für 99% der Fälle "Math.random" in Ordnung ist, aber es kann möglicherweise vorhergesagt werden. –

Antwort

14

aus den Spezifikationen:

random():

Liefert einen Zahlenwert mit positiven Zeichen, die größer oder gleich 0, jedoch weniger als 1 ist, ausgewählt zufällig oder pseudo zufällig etwa einheitliche Verteilung über diesen Bereich, mit einer implementierungsabhängigen Algorithmus oder Strategie. Diese Funktion benötigt keine Argumente .

Also die Antwort ist, dass es darauf ankommt, welche JavaScript-Engine Sie verwenden.

Ich bin nicht sicher, ob alle Browser die gleiche Strategie verwenden oder was diese Strategie ist leider

Es sollte für Ihre Zwecke in Ordnung sein. Nur wenn Sie eine große Anzahl von Zahlen machen, würden Sie anfangen, ein Muster zu sehen

+0

@cocotowet al. Ich habe mich gefragt, ob die Pseudo-Zufälligkeit gut ist oder nicht? wie ich denke, dass seine porobobly nicht gut genug für vegas oder wissenschaft aber gut genug für den täglichen bedarf ist? (Ich habe Osmething gemacht, das Entscheidungen für mich treffen wird, basierend auf einer Liste möglicher Entscheidungen. – David

+4

Es ist gut genug für alltägliche Bedürfnisse, wozu Javascript 'Math.random()' gehört. Das ist in Ordnung. –

+0

@JohnFeminella Bitte definieren " Alltägliche Bedürfnisse " – user877329

2

Es ist 100% zufällig genug für Ihre Zwecke. Es wird nach Zeit sortiert, sodass jedes Mal, wenn Sie es ausführen, unterschiedliche Ergebnisse erzielt werden.

Fügen Sie diese in Ihrem Browser Bar Adresse ...

javascript:alert(Math.random() * 2 > 1); 

und drücken Sie [Enter] ein paar Mal ... Ich habe "wahr, falsch, falsch, wahr" - zufällig genug :)

+1

Dein Code Beispiel zeigt nicht die Zufälligkeit des Zufallsgenerators Wenn Sie einen Schräglauf eingeführt haben, führt dies zu mehr falschen Werten als wahren Werten.Ein sehr kleiner Unterschied, aber immer noch ein Beispiel dafür, wie Sie die Qualität des Zufalls reduzieren können durch falsche Verwendung. – Guffa

+0

Stimmt ... aber wenn ich 50 Kontrollkästchen hätte ... wäre sogar die * Probe *, die ich gab, gut genug für die Frage des Davids. –

3

Die genaue Implementierung kann natürlich je nach Browser etwas variieren, aber sie alle verwenden irgendeine Art von Pseudozufallszahlengenerator. Obwohl es nicht wirklich zufällig ist, ist es sicherlich gut genug für alle allgemeinen Zwecke.

Sie sollten sich nur Sorgen machen über die Zufälligkeit, wenn Sie es für etwas verwenden, das außergewöhnlich gute Zufälligkeit, wie Verschlüsselung oder ein Glücksspiel im Spiel für Geld simuliert, aber dann würden Sie Javascript sowieso kaum verwenden.

1

Dies ist ein wenig übertrieben ... aber, ich konnte nicht widerstehen dieses tun :)

Sie diese ausführen kann in bar Ihrem Browser Adresse. Es erzeugt eine Zufallszahl zwischen 0 und 4, 100000 mal. Und gibt an, wie oft jede Nummer generiert wurde und wie oft eine Zufallszahl der anderen folgte.

Ich habe dies in Firefox 3.5.2 ausgeführt. Alle Zahlen scheinen in etwa gleich zu sein - was keine Voreingenommenheit anzeigt und kein offensichtliches Muster in der Art, wie die Zahlen erzeugt werden.

javascript: 
var max = 5; 
var transitions = new Array(max); 
var frequency = new Array(max); 
for (var i = 0; i < max; i++) 
{ 
    transitions[i] = new Array(max); 
} 
var old = 0, curr = 0; 
for (var i = 0; i < 100000; i++) 
{ 
    curr = Math.floor(Math.random()*max); 
    if (frequency[curr] === undefined) 
    { 
     frequency[curr] = -1; 
    } 
    frequency[curr] += 1; 
    if (transitions[old][curr] === undefined) 
    { 
     transitions[old][curr] = -1; 
    } 
    transitions[old][curr] += 1; 
    old = curr; 
} 
alert(frequency); 
alert(transitions); 
+1

Das ist überhaupt nicht übertrieben - es ist völlig unzureichend. Wenn man sich die Verteilung anschaut, sagt man nicht viel über die Entropiequalität, und wie andere gesagt haben, hängt das genaue Verhalten von der Implementierung ab. Daher sagt das Testen von Firefox 3.5.2 nichts über die allgemeine Situation aus. –

11

Mit Math.random() ist in Ordnung, wenn Sie nicht zentral & Bündelung der Ergebnisse verwendet wird, das heißt für OAuth.

Zum Beispiel hat unsere Website Math.random() verwendet, um zufällige "nonce" Zeichenfolgen für die Verwendung mit OAuth zu generieren. Das Original JavaScript library tat dies, indem er ein Zeichen aus einer vorgegebenen Liste mit Math auswählte.(Random): das heißt

for (var i = 0; i < length; ++i) { 
    var rnum = Math.floor(Math.random() * chars.length); 
    result += chars.substring(rnum, rnum+1); 
} 

Das Problem ist, wurden Benutzer doppelte nonce Strings bekommen (sogar eine 10 Zeichenlänge mit - theoretisch ~ 10^18 Kombinationen), in der Regel innerhalb weniger Sekunden von einander. Ich nehme an, dass dies auf Math.random() zurückzuführen ist, das aus dem Zeitstempel stammt, wie eines der anderen erwähnten Poster.

+3

+1 für die Beschreibung, wie Timestamp-basiertes Seeding doppelte Nummern in gleichzeitigen Umgebungen generieren kann. – Twilite

Verwandte Themen