均匀分布的随机数
嘿,有没有办法选择均匀分布的随机数?我用这个函数均匀分布的随机数
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