今天在各种浏览器上运行单元测试时,我遇到了一个奇怪的“错误”。我以前在Firefox和IE上运行过这些测试,但显然还没有在Chrome(v19-dev)上运行。在Chrome中进行测试时,由于我计算的两个值不匹配,其中一个测试始终失败。
当我深入研究发生的情况时,我意识到问题在于,我假设如果我用100,000个
在Chrome中,我始终从 100,000 个数中至少获得了两个匹配的值。Firefox 和 IE9 从未遇到碰撞。这里是我专门为测试编写的 jsfiddle,创建了包含1M个
当我深入研究发生的情况时,我意识到问题在于,我假设如果我用100,000个
Math.random()
值填充一个数组,它们都将是唯一的(不会有任何碰撞)。结果在Chrome上并非如此。在Chrome中,我始终从 100,000 个数中至少获得了两个匹配的值。Firefox 和 IE9 从未遇到碰撞。这里是我专门为测试编写的 jsfiddle,创建了包含1M个
Math.random()
条目的数组:http://jsfiddle.net/pseudosavant/bcduj/
有人知道为什么 Chrome 用于 Math.random
的伪随机数生成器实际上并不是那么随机吗?看起来,这可能会对任何客户端 JS 加密程序使用 Math.random
的影响。
Math.random()
生成双精度浮点数,但 OP 的等式测试首先将这些数字转换为字符串,因此除非浏览器决定在其字符串表示中包括十五个小数点后面的更多位数,否则 OP 正在比较的值的熵要远远小于那个。 - ruakh100.0
和100.1
之间大约有7,036,874,417,766个双精度浮点数。在0.0
和1.0
之间,大约有2的62次方个双精度浮点数。 - ruakh5555555.5555555555555
转为字符串可能包括相似数量的有效数字,且小数点后的位数比5.5555555555555
要少。 - ruakh