如何在javascript中使用Math.random实现随机性?我已经做了一些随机选择大约50种不同选项的东西。我想知道使用Math.random来获得随机性是多么的舒服。
答案 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);