均匀分布的随机数

6

嘿,有没有一种方法可以选择均匀分布的随机数?我使用了这个函数

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

该函数返回1或0。然而,我认为它并没有完全50%的机会产生其中任何一个结果。有更好的想法吗?谢谢。


在我看来这是可以的。Math.random() * 2 返回一个介于0到1.99之间的数字;向下取整将为0赋值于0-0.99之间的数值,而为1赋值于1-1.99之间的数值,因此它相当均匀。但我担心有人有更好的想法。 - Salman A
1
为什么你不认为它们各自是确切的50%?运行10000次并对结果进行平均,可以得到0.5026,几乎恰好是50%的0和50%的1。(这是在Firefox 4中) - asm
6个回答

6
如果您不相信,请检查:
<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%。

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

哦,这是我以前没见过的一个很棒的技巧(在地址栏中编写JavaScript代码)。我不再需要编写带有嵌入源代码的HTML文件了。就为这个点赞! - paxdiablo
@paxdiablo 或者你可以使用 Firefox 的 Firebug 控制台,Chrome 的内置控制台,Opera 的内置控制台。不知道其他浏览器是否也有插件或工具。 - Alin Purcaru

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。


1

它以相等的概率生成0或1。

但是为什么你没有使用:

Math.round(Math.random())

你想要能够改变生成 0、1、2、...、N 吗?如果是的话,请保留你的实现。


1

这个比例已经接近50%,如果你担心有差异(如果确实存在),那么你首先就不会使用伪随机数 :-)

运行1000万次循环,得到的比率是5000931:4999069,误差仅为万分之一(0.00931%)。


0

两种结果的机会完全相等。你为什么认为它不是呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接