如何在JavaScript中使用Math.random实现随机性?

时间:2010-02-26 19:37:12

标签: javascript random

如何在javascript中使用Math.random实现随机性?我已经做了一些随机选择大约50种不同选项的东西。我想知道使用Math.random来获得随机性是多么的舒服。

5 个答案:

答案 0 :(得分:14)

从规格:

  

随机():

     

返回带有正数的Number值   符号,大于或等于0但是   小于1,随机选择或伪   随机地大致均匀   分布在该范围内,使用   依赖于实现的算法或   战略。这个功能不需要   参数。

所以答案是它取决于你正在使用的JavaScript引擎。

我不确定所有浏览器是否使用相同的策略或不幸的策略

这对你的目的应该没问题。只有你做了大量的数字才会开始看到一种模式

答案 1 :(得分:11)

如果你没有集中汇集和使用Math.random()就可以了。使用结果,即OAuth。

例如,我们的网站使用Math.random()生成随机“nonce”字符串,以便与OAuth一起使用。原始JavaScript library通过使用Math.random()从预定列表中选择一个字符来做到这一点:即。

for (var i = 0; i < length; ++i) {
    var rnum = Math.floor(Math.random() * chars.length);
    result += chars.substring(rnum, rnum+1);
}

问题是,用户获得了重复的nonce字符串(即使使用10个字符的长度 - 理论上为~10 ^ 18个组合),通常在几秒钟之内。我的猜测是由于Math.random()从时间戳播种,这是其中一个提到的海报。

答案 2 :(得分:3)

确切的实现当然可以根据浏览器的不同而有所不同,但它们都使用某种伪随机数生成器。虽然它并不是随机的,但对于所有一般用途来说肯定是足够好的。

如果您将其用于需要非常好的随机性的东西,例如加密或模拟玩游戏中的机会游戏,那么您应该只担心随机性,但是无论如何您很难使用Javascript。

答案 3 :(得分:2)

100%随机足以满足您的目的。它是按时间播种的,因此每次运行它都会得到不同的结果。

将其粘贴到浏览器地址栏中......

javascript:alert(Math.random() * 2 > 1);

并按[Enter]几次......我得到“真,假,假,真” - 足够随意:)

答案 4 :(得分:1)

这有点矫枉过正......但是,我无法抗拒这样做:)

您可以在浏览器地址栏中执行此操作。它会生成0到4之间的随机数,100000次。并输出每个数字生成的次数以及一个随机数跟随另一个的次数。

我在Firefox 3.5.2中执行了此操作。所有数字似乎都大致相等 - 表明没有偏见,数字生成方式也没有明显的模式。

javascript:
var max = 5;
var transitions = new Array(max);
var frequency = new Array(max);
for (var i = 0; i < max; i++)
{
     transitions[i] = new Array(max);
}
var old = 0, curr = 0;
for (var i = 0; i < 100000; i++)
{
   curr = Math.floor(Math.random()*max);
   if (frequency[curr] === undefined) 
   {
      frequency[curr] = -1;
   }
   frequency[curr] += 1;
   if (transitions[old][curr] === undefined)
   {
      transitions[old][curr] = -1;
   }
   transitions[old][curr] += 1;
   old = curr;
}
alert(frequency);
alert(transitions);