Wie können Zufallszahlen in einem sehr großen Bereich über Javascript generiert werden?

8

Ich habe diese Funktion lange benutzt und war damit zufrieden. Du hast es wahrscheinlich Millionen Male gesehen. Es ist sogar in der Beispielteil der MDN-Dokumentation für Math.random ()!

%Vor%

Aber wenn ich es auf eine wirklich große Reichweite anspielte, lief es wirklich schlecht. Hier sind einige Ergebnisse:

%Vor%

Kaum zufällig. Alle Zahlen sind gerade.

Meine Frage ist folgende: Was ist der CANONICAL Weg (falls vorhanden), um dieses Problem zu überwinden? Ich habe den Eindruck, dass die obige Zufallsfunktion die Go-To-Funktion für Zufallszahlen in Reichweite ist. Vielen Dank im Voraus.

    
tsikov 23.03.2014, 10:37
quelle

3 Antworten

2

Die Antwort lautet im Allgemeinen: Verwenden Sie Math.random nicht. Es erledigt den Job, aber es ist nicht besonders gut. Darüber hinaus wird jede Zahl in Javascript größer als 0xffffffffUL nicht durch ganzzahlige Werte dargestellt - es ist ein IEEE 754-Wert mit einem Verhalten auf der MDN-Site notiert: "Beachten Sie, dass als Zahlen in JavaScript IEEE 754 Gleitkommazahlen mit < starkes> Rund-auf-nächstes-gleichmäßiges-Verhalten .... "

Und das siehst du.

Wenn Sie größere Zufallszahlen wünschen, müssen Sie wahrscheinlich Mersenne Twister oder 32-Bit-Zufallszahlen von Blum-Blum-Shub erhalten und diese multiplizieren. Das wird das Rundungsproblem beseitigen.

    
user1329482 23.03.2014, 13:15
quelle
3

Die WebCrypto-API (im Entwurf von allen gängigen Browsern unterstützt) bietet kryptografische Zufallszahlen ....

%Vor%

W3C-Standard Ссылка

Beispiel von hier. Ссылка

    
dave.zap 30.10.2016 06:51
quelle
1

Das ist seltsam! Nun, Sie wissen, dass es wirklich keine Zufälligkeit gibt, wenn es um Computer geht. Es wird immer ein Algorithmus verwendet. Sie haben also eine Zahl gefunden, die sogar für diesen speziellen Algorithmus verantwortlich ist. Ich habe es ausprobiert, es ist nicht unbedingt durch große Zahlen verursacht. Wahrscheinlicher ist eine Art der Faktorisierung der Zahl. Versuchen Sie es einfach mit einer anderen Nummer, sogar größer, wenn Sie möchten, und Sie sollten eine Ausgabe erhalten, die nicht gleichmäßig ist. Ex. 134359738368, die noch größer ist nicht alle ungeraden oder geraden Zahlen aus.

    
user3363398 23.03.2014 12:58
quelle

Tags und Links