javascript - 为什么 Google Chrome 浏览器的 Math.random 数字生成器不是 *that* 随机数?

标签 javascript google-chrome random

今天我在各种浏览器中运行一些单元测试时遇到了一个奇怪的“错误”。在今天之前,我已经在 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/

相关文章:

javascript - Chartjs + Vue.js - 无法读取未定义的属性 '_meta'

google-chrome - anchor 内跨度内 anchor , Chrome

python - 生成随机且唯一的索引,其范围为 n 个组合

javascript - 使用 angularJS 服务将 `setInterval` 转换为 AngularJS

JavaScript 覆盖我的数据

html - carousel jquery 在 firefox 和 opera 中不工作

haskell - 如何在haskell中使用带有fmap的随机生成器使用函数?

random - 在恒定时间内从几何分布中采样

javascript - merge 和 toProperty 在 bacon.js 中做什么

google-chrome - Chrome 在使用代理时给出 "Your connection is not private"