Vorhersage des Seed von Javascript Math.random

8

Okay, ich untersuche nun, wie Zufallszahlen mit der Math.random-Methode generiert werden. Bisher habe ich gelernt, dass es mit einem "zufälligen" Startwert beginnt, und dieser Startwert wird in eine komplexe Gleichung eingefügt, um eine Zufallszahl zu erzeugen. Wenn der Samen immer gleich ist, wird das Ergebnis immer gleich sein?

Ich habe gehört, dass die Samen für Math.random durch die aktuelle Zeit generiert werden, ist das korrekt? Sie müssen die aktuelle Zeit bis zu den Millisekunden oder etwas verwenden, denn wenn Sie dies nicht tun würden, würden Sie dasselbe Ergebnis erzielen.

Was genau ist der Samen? Ist es die Zeit wie "10:45" oder die Uhrzeit UND Datum wie "10:45 11/8/12" oder eine Kombination?

Wie kann ich den Seed finden, damit ich die Ausgabe vorhersagen kann?

Ich möchte das anschließen können:

%Vor%

in meine URL-Leiste und kann das Ergebnis vorhersagen. Ist das möglich?

    
43.52.4D. 09.11.2012, 03:48
quelle

4 Antworten

14

Ich habe durch die Rhino Quelle geschaut Code , um herauszufinden, welche Pseudozufallsfunktion sie verwenden. Anscheinend fallen zurück zu der Funktion Math.random , die in Java-Standardbibliothek .

Die Dokumentation für Math.random sagt:

  

Gibt einen doppelten Wert mit einem positiven Vorzeichen, größer als oder gleich 0.0 und kleiner als 1.0 zurück. Zurückgegebene Werte werden pseudozufällig mit (annähernd) gleichmäßiger Verteilung aus diesem Bereich gewählt.

     

Wenn diese Methode zum ersten Mal aufgerufen wird, erzeugt sie genau wie durch den Ausdruck

einen neuen Pseudozufallszahlengenerator
%Vor%
  

Dieser neue Pseudozufallszahlengenerator wird danach für alle Aufrufe dieser Methode verwendet und nirgendwo sonst verwendet.

     

Diese Methode wird ordnungsgemäß synchronisiert, um die korrekte Verwendung durch mehr als einen Thread zu ermöglichen. Wenn jedoch viele Threads Pseudozufallszahlen mit einer hohen Rate erzeugen müssen, kann dies die Konkurrenz für jeden Thread reduzieren, der seinen eigenen Pseudozufallszahlengenerator hat.

Also habe ich die Dokumentation für java.util.Random überprüft und dies (für den Standardkonstruktor):

  

Erzeugt einen neuen Zufallszahlengenerator. Sein Startwert wird auf einen Wert basierend auf der aktuellen Zeit initialisiert:

%Vor%
  

Zwei Zufallsobjekte, die innerhalb der gleichen Millisekunde erstellt werden, haben dieselbe Sequenz von Zufallszahlen.

Jetzt wissen wir also sicher, dass der Seed die aktuelle Zeit in Millisekunden ist. Auch die Dokumentation für die zweiter Konstruktor sagt:

  

Erstellt einen neuen Zufallszahlengenerator mit einem einzelnen langen Seed:

%Vor%
  

Wird von der Methode neben dem Zustand des Pseudozufallszahlengenerators verwendet.

Die Dokumentation für die Methode setSeed sagt:

  

Setzt den Anfangswert dieses Zufallszahlengenerators mit einem einzelnen langen Seed. Der allgemeine Vertrag von setSeed besteht darin, dass er den Zustand dieses Zufallsgeneratorobjekts so ändert, dass es sich in genau demselben Zustand befindet, als wenn es gerade mit dem Argument seed als Seed erzeugt worden wäre. Die Methode setSeed wird wie folgt durch die Klasse Random implementiert:

%Vor%
  

Die Implementierung von setSeed nach Klasse Random geschieht nur mit 48 Bits des angegebenen Seeds. Im Allgemeinen kann eine überschreibende Methode jedoch alle 64 Bits des langen Arguments als Startwert verwenden. Hinweis: Obwohl der Startwert eine AtomicLong ist, muss diese Methode dennoch synchronisiert werden, um die korrekte Semantik von haveNextNextGaussian zu gewährleisten.

Die Aktuelle Methode zum Generieren der Zufallszahl ist nextDouble :

  

Gibt den nächsten pseudozufälligen, gleichmäßig verteilten doppelten Wert zwischen 0.0 und 1.0 aus der Sequenz dieses Zufallsgenerators zurück.

Die Implementierung der nextDouble -Funktion ist wie folgt:

%Vor%

Es ist eindeutig hängt von der Funktion next ab:

  

Erzeugt die nächste Pseudozufallszahl. Unterklasse sollte dies überschreiben, da dies von allen anderen Methoden verwendet wird.

Die Implementierung der next -Funktion ist wie folgt:

%Vor%

Das ist die Pseudozufallsfunktion, nach der Sie suchen. Wie es in der Dokumentation heißt:

  

Dies ist ein linearer kongruenter Pseudozufallszahlengenerator, wie von D. H. Lehmer definiert und von Donald E. Knuth in der Kunst der Computerprogrammierung, Band 2: Seminumerische Algorithmen, Abschnitt 3.2.1. beschrieben.

Beachten Sie jedoch, dass dies nur der von Rhino verwendete Zufallsgenerator ist. Andere Implementierungen wie Spidermonkey und V8 können ihre eigenen Pseudozufallszahlengeneratoren haben.

    
Aadit M Shah 09.11.2012, 06:12
quelle
6

Es ist wahrscheinlich, dass der Seed mehr als die Millisekunden zählt, weil Sie Math.random () viele Male in derselben Millisekunde aufrufen können und jedes Mal einen anderen Wert zurückgibt.

%Vor%

Meine Ausgabe:

%Vor%

Wenn ich es implementiere, könnte ich den initialen Seed basierend auf einer Millisekunden-Zählung machen und dann jedes Mal, wenn er aufgerufen wird, 1 addieren, so dass Sie nicht zweimal den gleichen Seed-Wert erhalten würden.

Hier finden Sie eine 100% genaue Vorhersage der Ausgabe von Math.random() :

%Vor%

Jetzt wird Math.random() immer .5 zurückgeben.

    
evan 09.11.2012 03:55
quelle
0

Der Seed ist ein numerischer Wert, also denke ich, dass es das wäre, wenn Sie Date.now() (oder new Date().getTime() für ältere Browser) aufrufen.

Ich bin mir jedoch nicht sicher, ob dieser Seed verwendet wird oder ob der Seed für die aktuelle Seite isoliert ist oder für den gesamten Browserprozess gilt. Die Vorhersage von Zufallszahlen wird als sehr schwierig oder unmöglich angesehen, das ist der springende Punkt, dass sie zufällig sind.

    
Niet the Dark Absol 09.11.2012 03:52
quelle
0

Nein, Sie können den Seed nicht vorhersagen, aber Sie können präemptiv genug Zahlen erzeugen, um eine Übereinstimmung genau zu erzwingen.

Wie auch immer, beginnen Sie mit dem Lesen der Wiki-Seite auf RNGs - Ссылка , dem Blick auf die praktischen Implementierungen von PRNGs.

    
Sean Kinsey 09.11.2012 05:34
quelle

Tags und Links