Seit 6 Jahren habe ich einen Zufallsgenerator auf meiner Website. Lange Zeit war es das erste oder zweite Ergebnis bei Google für "Zufallszahlengenerator" und wurde verwendet, um Dutzende, wenn nicht Hunderte von Wettbewerben und Zeichnungen in Diskussionsforen und Blogs zu entscheiden (ich weiß, weil ich die Verweise in meinem sehe Weblogs und in der Regel einen Blick darauf werfen).
Heute hat mir jemand eine E-Mail geschickt, um mir zu sagen, dass es möglicherweise nicht so zufällig ist, wie ich dachte. Sie versuchte sehr große Zufallszahlen zu generieren (z. B. zwischen 1 und 10000000000000000000) und stellte fest, dass diese fast immer die gleiche Anzahl von Ziffern hatten. In der Tat habe ich die Funktion in eine Schleife eingeschlossen, damit ich Tausende von Zahlen erzeugen konnte, und für sehr große Zahlen betrug die Variation nur etwa zwei Größenordnungen.
Warum?
Hier ist die Loop-Version, damit Sie sie selbst ausprobieren können:
http://andrew.hedges.name/experiments/random/randomness.html
Es enthält sowohl eine einfache Implementierung aus dem Mozilla Developer Network als auch Code aus dem Jahr 1997, den ich von einer nicht mehr vorhandenen Webseite entfernt habe (Paul Houles "Central Randomizer 1.3"). Zeigen Sie die Quelle an, um zu sehen, wie die einzelnen Methoden funktionieren.
Ich habe hier und anderswo über Mersenne Twister gelesen . Was mich interessiert, ist, warum es keine größeren Unterschiede in den Ergebnissen der in JavaScript integrierten Math.random- Funktion geben würde. Vielen Dank!
quelle
Antworten:
Gegebene Zahlen zwischen 1 und 100.
Gegebene Zahlen zwischen 1 und 1000.
und so weiter.
Wenn Sie also zufällig einige auswählen, hat die überwiegende Mehrheit der ausgewählten Zahlen die gleiche Anzahl von Ziffern, da die überwiegende Mehrheit der möglichen Werte die gleiche Anzahl von Ziffern hat.
quelle
Ihre Ergebnisse werden tatsächlich erwartet. Wenn die Zufallszahlen gleichmäßig in einem Bereich von 1 bis 10 ^ n verteilt sind, würden Sie erwarten, dass etwa 9/10 der Zahlen n Ziffern und weitere 9/100 n-1 Ziffern haben.
quelle
Es gibt verschiedene Arten von Zufälligkeiten. Math.random gibt Ihnen eine gleichmäßige Verteilung der Zahlen.
Wenn Sie unterschiedliche Größenordnungen wünschen, würde ich vorschlagen, eine Exponentialfunktion zu verwenden, um eine sogenannte Potenzgesetzverteilung zu erstellen :
Diese Funktion sollte Ihnen ungefähr die gleiche Anzahl von 1-stelligen Zahlen wie 2-stellige Zahlen und 3-stellige Zahlen geben.
Es gibt auch andere Verteilungen für Zufallszahlen wie die Normalverteilung (auch Gaußsche Verteilung genannt).
quelle
minimum = 1
und das gesetztmaximum = 10
und manchmal 11 als Ergebnis erhalten. Sie wollten wahrscheinlichMath.floor
anstelle vonMath.round
Sieht für mich völlig zufällig aus! (Hinweis: Es ist browserabhängig.)
Persönlich denke ich, dass meine Implementierung besser wäre, obwohl ich sie XKCD gestohlen habe , der IMMER anerkannt werden sollte:
quelle
Im folgenden Artikel wird erläutert, wie math.random () in den wichtigsten Webbrowsern (nicht) sicher ist: "Temporäre Benutzerverfolgung in den wichtigsten Browsern und domänenübergreifende Informationslecks und Angriffe" von Amid Klein (2008) . Es ist nicht stärker als die in Java oder Windows integrierten PRNG-Funktionen.
Andererseits erfordert die Implementierung von SFMT der Periode 2 ^ 19937-1 2496 Bytes des internen Zustands, der für jede PRNG-Sequenz aufrechterhalten wird. Einige Leute können dies als unverzeihliche Kosten betrachten.
quelle
Wenn Sie eine Zahl wie 10000000000000000000 verwenden, gehen Sie über die Genauigkeit des Datentyps hinaus, den Javascript verwendet. Beachten Sie, dass alle generierten Zahlen mit "00" enden.
quelle
Ich habe JS Pseudozufallszahlengenerator für Chaos Game ausprobiert .
Mein Sierpiński-Dreieck sagt, es sei ziemlich zufällig:
quelle
Wenn Sie Zahlen bis beispielsweise 1e6 generieren, erhalten Sie hoffentlich alle Zahlen mit ungefähr gleicher Wahrscheinlichkeit. Das bedeutet auch, dass Sie nur eine von zehn Chancen haben, eine Zahl mit einer Ziffer weniger zu erhalten. Eine Chance von eins zu hundert, zwei Ziffern weniger zu erhalten usw. Ich bezweifle, dass Sie bei Verwendung eines anderen RNG einen großen Unterschied feststellen werden, da Sie eine gleichmäßige Verteilung über die Zahlen haben, nicht deren Logarithmus.
quelle
Nicht zufällige Zahlen, die gleichmäßig von 1 bis N verteilt sind, haben dieselbe Eigenschaft. Beachten Sie, dass es (in gewissem Sinne) um Präzision geht. Bei einer gleichmäßigen Verteilung auf 0-99 (als Ganzzahlen) sind 90% der Zahlen zweistellig. Eine gleichmäßige Verteilung auf 0-999999 hat 905 ihrer Zahlen mit fünf Ziffern.
Jeder Satz von Zahlen (unter einigen nicht zu restriktiven Bedingungen) hat eine Dichte. Wenn jemand "Zufallszahlen" diskutieren möchte, sollte die Dichte dieser Zahlen angegeben werden (wie oben angegeben). Eine gemeinsame Dichte ist die einheitliche Dichte. Es gibt andere: die Exponentialdichte, die Normaldichte usw. Man muss wählen, welche Dichte relevant ist, bevor man einen Zufallszahlengenerator vorschlägt. Auch Zahlen, die von einer Dichte stammen, können oft leicht mit kariösen Mitteln in eine andere Dichte umgewandelt werden.
quelle