簡體   English   中英

JavaScript Math.Random()連續兩次創建相同數字的幾率是多少?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM