今天我在各种浏览器中运行一些单元测试时遇到了一个奇怪的“错误”。在今天之前,我已经在 Firefox 中多次运行过测试,甚至在 IE 中运行过,但显然还没有在 Chrome (v19-dev) 中运行过。当我在 Chrome 中运行它们时,它始终未能通过一项测试,因为我计算的两个值不匹配。
当我真正深入研究正在发生的事情时,我意识到问题在于我假设如果我用 100,000 个 Math.random()
值填充一个数组,它们都是唯一的(那里不会有任何碰撞)。事实证明,在 Chrome 中并非如此。
在 Chrome 中,我始终得到至少 两对 匹配的值(共 100,000 个)。 Firefox 和 IE9 从未经历过冲突。这是我写的一个 jsfiddle 只是为了测试它在数组中创建 1M Math.random()
条目:http://jsfiddle.net/pseudosavant/bcduj/
有谁知道为什么用于 Math.random
的 Chrome 伪随机数生成器真的不是那个随机数?看起来这可能会对任何曾经使用过 Math.random
的客户端 js 加密例程产生影响。
最佳答案
显然是 V8 中的 Math.random() only works with 32 bit values (过去甚至没有正确随机化所有这些)。对于 32 位,碰撞概率在 2^16 = 65k 值附近达到 50%...
关于javascript - 为什么 Google Chrome 浏览器的 Math.random 数字生成器不是 *that* 随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9550796/