嘿,有沒有辦法選擇均勻分佈的隨機數?我用這個函數均勻分佈的隨機數
Math.floor(Math.random()*2)
返回1或0。然而,我不認爲它具有精確50%的機會,以產生任一個。更好的想法?謝謝
嘿,有沒有辦法選擇均勻分佈的隨機數?我用這個函數均勻分佈的隨機數
Math.floor(Math.random()*2)
返回1或0。然而,我不認爲它具有精確50%的機會,以產生任一個。更好的想法?謝謝
如果你不相信,請檢查:
<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或1。
但你爲什麼不使用:
Math.round(Math.random())
?你想改變生成0,1,2,...,N嗎?如果這樣保持你的實施。
任一結果的機會恰好爲50%。是什麼讓你覺得它不是?
這足以接近50%的地方,如果你擔心的差異(如果確實有的話),你不會使用擺在首位的僞隨機數:-)
被點以1000萬次迭代運行一個循環會給我一個5,000,931到4,999,069的比例,這個誤差只有一萬分之一(0.00931%)。
它應該給你均勻分佈。
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);
哦,這是一個我以前從未見過的巧妙技巧(在地址欄中編碼的JavaScript)。不再爲我編寫帶有嵌入式源代碼的HTML文件。 +1就是這樣! – paxdiablo 2011-04-20 03:10:54
@paxdiablo或者你也可以在Firefox中使用Firebug的控制檯,Chrome的附帶控制檯包括Opera的控制檯。不知道其他瀏覽器,但他們可能也有插件或工具。 – 2011-04-20 05:53:55
試試看:
<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。
IMO這是好的。 'Math.random()* 2'返回一個0到1之間的數字;地板它會給你0值0-0.99和1值1-1.99,所以它非常平均。但恐怕somone的想法更好。 – 2011-04-19 11:48:28
爲什麼你不認爲這對任何一個人來說都是50%?運行10000次,平均結果爲0.5026,幾乎是50%0的50%1。 (這是在Firefox 4中) – asm 2011-04-19 11:50:31