[英]What are the chances that JavaScript Math.Random() will create the same number twice in a row?
它是否正確? 使用 - http://en.wikipedia.org/wiki/Binomial_probability
看起來值從.0000000000000000到.9999999999999999
發生兩次的概率= p ^ 2 =(1/9999999999999999)^ 2 = 1.0 e-32
我想我在這里錯過了一些東西?
另外,偽隨機數發生器如何改變這種計算?
謝謝。
我認為連續獲得兩個數字的概率是1除以生成器的范圍,假設它具有良好的分布。
這樣做的原因是第一個數字可以是任何數字 ,第二個數字需要再次成為該數字,這意味着我們根本不關心第一個數字。 連續兩次獲得相同數字的概率與獲得任何特定數字一次的概率相同。
連續兩次獲得某個特定數字,例如連續兩次0.5,將是p ^ 2; 但是,如果你只是連續兩次關心任何數字,那只是p。
在理想世界中,Math.random()絕對是隨機的,其中一個輸出完全獨立於另一個輸出,(假設p =產生任何給定數字的概率)導致重復的任何值可能為p ^ 2緊接着(正如其他人已經說過的那樣)。
在實踐中,人們希望Math.random快速,這意味着引擎使用偽隨機數生成器。 有許多不同類型的PRNG,但最基本的是線性同余發生器,它基本上是一個功能:
s(n + 1) = some_prime * s(n) + some_value mod some_other_prime
如果使用這樣的生成器,那么在調用random()
some_other_prime
次之前,您將看不到重復的值。 你得到了保證。
然而,相對最近,顯而易見的是,這種行為(加上PRNG與當前時間一起播種)可以用於某些形式的跟蹤導致瀏覽器做了很多事情,這意味着你不能假設隨后的random()
電話。
如果這些數字是真正隨機的,那么你會發現它們確實以1 / p的概率出現,所以兩倍就是1 / p ^ 2。
p的值不完全是你所擁有的值,因為數字在內部表示為二進制。 計算出數字在javascript中有多少位尾數,並將其用於組合計數。
“偽隨機”部分更有趣,因為偽隨機數發生器的屬性不同。 Knuth在Seminumerical Algorithms中做了一些可愛的工作,但基本上大多數常見的PN發生器至少有一些光譜分布。 Cryptograp0hic PN發生器通常更強大。
更新 :時間量不應該很大。 無論是一毫秒還是一年,只要你不更新狀態概率將保持不變。
得到2個給定數字的概率是(1 / p)^ 2,但得到2個相同數字(任意)的概率是1 / p。 那是因為第一個數字可以是任何數字,第二個數字只需匹配。
你可以找出來,讓它運行幾天:)
var last = 0.1;
var count = 0 | 0;
function rand(){
++count;
var num = Math.random();
if(num === last){
console.log('count: '+count+' num: '+num);
}
last = num;
}
while(true) rand();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.