均匀分布的随机数

问题描述:

嘿,有没有办法选择均匀分布的随机数?我用这个函数均匀分布的随机数

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

如果你不相信,请检查:

<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); 
+0

哦,这是一个我以前从未见过的巧妙技巧(在地址栏中编码的JavaScript)。不再为我编写带有嵌入式源代码的HTML文件。 +1就是这样! – paxdiablo 2011-04-20 03:10:54

+0

@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。