2011-04-19 197 views
5

嘿,有沒有辦法選擇均勻分佈的隨機數?我用這個函數均勻分佈的隨機數

Math.floor(Math.random()*2) 

返回1或0。然而,我不認爲它具有精確50%的機會,以產生任一個。更好的想法?謝謝

+0

IMO這是好的。 'Math.random()* 2'返回一個0到1之間的數字;地板它會給你0值0-0.99和1值1-1.99,所以它非常平均。但恐怕somone的想法更好。 – 2011-04-19 11:48:28

+1

爲什麼你不認爲這對任何一個人來說都是50%?運行10000次,平均結果爲0.5026,幾乎是50%0的50%1。 (這是在Firefox 4中) – asm 2011-04-19 11:50:31

回答

5

如果你不相信,請檢查:

<script type="text/javascript"> 
var total = 0; 
var ones = 0; 
for (var i = 0; i < 100000; i++, total++) { 
    ones += Math.floor(Math.random()*2); 
} 
alert(ones/total); 
</script> 

此代碼給我0.49972 - 非常接近於50%。

0

它以相同的機會產生0或1。

但你爲什麼不使用:

Math.round(Math.random()) 

?你想改變生成0,1,2,...,N嗎?如果這樣保持你的實施。

0

任一結果的機會恰好爲50%。是什麼讓你覺得它不是?

1

這足以接近50%的地方,如果你擔心的差異(如果確實有的話),你不會使用擺在首位的僞隨機數:-)

被點

以1000萬次迭代運行一個循環會給我一個5,000,931到4,999,069的比例,這個誤差只有一萬分之一(0.00931%)。

4

它應該給你均勻分佈。

var a=new Array(0,0); for (i=0; i<100000; i++) a[Math.floor(Math.random() * 2)]++; alert(a); 

您可以通過複製粘貼嘗試到地址欄:

javascript:var a=new Array(0,0); for (i=0; i<100000; i++) a[Math.floor(Math.random() * 2)]++; alert(a); 
+0

哦,這是一個我以前從未見過的巧妙技巧(在地址欄中編碼的JavaScript)。不再爲我編寫帶有嵌入式源代碼的HTML文件。 +1就是這樣! – paxdiablo 2011-04-20 03:10:54

+0

@paxdiablo或者你也可以在Firefox中使用Firebug的控制檯,Chrome的附帶控制檯包括Opera的控制檯。不知道其他瀏覽器,但他們可能也有插件或工具。 – 2011-04-20 05:53:55

3

試試看:

<script type="text/javascript"> 

var zero=0; 
var one=0; 

for (var i=0;i<1000000;i++) 
{ 
    var num=Math.floor(Math.random()*2) 
    if (num) zero++; 
    if (!num) one++; 
} 

document.write("Zero: "+zero+"<br />"); 
document.write("One: "+one+"<br />"); 

</script> 

您正在尋找在這種情況下,答案這是很好的一百萬的平方根之內。即如果您獲得的是真正的隨機數,您希望結果爲500,000 + - 1000。