为什么谷歌Chrome的Math.random数字生成器不*随机?

pse*_*ant 14 javascript random google-chrome

当我在各种浏览器中运行一些单元测试时,我今天遇到了一个奇怪的"bug".我在今天之前已经多次在Firefox中运行测试,甚至IE,但显然还不是Chrome(v19-dev).当我在Chrome中运行它时,它始终无法通过一次测试,因为我计算的两个值不匹配.

当我真正挖掘正在发生的事情时,我意识到问题是我假设如果我填充一个具有100,000个Math.random()值的数组,它们都将是唯一的(不会有任何冲突).事实证明,在Chrome中并非如此.

在Chrome中,我始终获得至少对与100,000匹配的值.Firefox和IE9从未发生过冲突.这是我写的一个jsfiddle,用于测试它Math.random()在数组中创建1M 条目:http://jsfiddle.net/pseudosavant/bcduj/

有谁知道这是为什么用于Chrome的伪随机数生成器Math.random是真的不在于随机的?看起来这可能会对任何曾经使用的客户端js加密例程产生影响Math.random.

Mic*_*rdt 28

显然,V8中的Math.random()仅适用于32位值(并且甚至没有正确地将所有这些随机化).对于32位,碰撞的概率在2 ^ 16 = 65k值附近达到50%......