javascript中的Math.random是如何实现随机性的?我做了一些随机选择大约 50 个不同选项的东西。我想知道使用 Math.random 来获得随机性应该有多舒服。
javascript中的Math.random是如何实现随机性的?
从规格来看:
随机的():
返回一个带有正号的数字值,大于或等于 0 但小于 1,使用依赖于实现的算法或策略随机或伪随机选择,在该范围内具有近似均匀的分布。这个函数没有参数。
所以答案是这取决于您使用的 JavaScript 引擎。
我不确定是否所有浏览器都使用相同的策略,或者不幸的是该策略是什么
对你的目的来说应该没问题。只有当你做大量的数字时,你才会开始看到一个模式
如果您不是集中汇集和使用结果,即用于 OAuth,则使用 Math.random() 很好。
例如,我们的站点使用 Math.random() 生成随机的“nonce”字符串以用于 OAuth。最初的JavaScript 库通过使用 Math.random() 从预先确定的列表中选择一个字符来做到这一点:即
for (var i = 0; i < length; ++i) {
var rnum = Math.floor(Math.random() * chars.length);
result += chars.substring(rnum, rnum+1);
}
问题是,用户收到重复的随机数字符串(即使使用 10 个字符长度 - 理论上 ~10^18 个组合),通常在几秒钟之内。我猜这是由于 Math.random() 从时间戳中播种,正如其他海报之一所提到的。
确切的实现当然会因浏览器而有所不同,但它们都使用某种伪随机数生成器。虽然它不是真正随机的,但对于所有一般用途来说肯定足够了。
如果您将随机性用于需要非常好的随机性的东西,例如加密或模拟金钱游戏,那么您应该只担心随机性,但无论如何您都不会使用 Javascript。
它是100% 随机的,足以满足您的目的。它是按时间播种的,所以每次运行它,你都会得到不同的结果。
将此粘贴到您的浏览器地址栏中...
javascript:alert(Math.random() * 2 > 1);
然后按 [Enter] 几次......我得到了“真、假、假、真”——足够随机:)
这有点矫枉过正……但是,我无法抗拒这样做:)
您可以在浏览器地址栏中执行此操作。它生成 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);