【发布时间】:2012-03-21 23:44:27
【问题描述】:
我今天在各种浏览器中运行一些单元测试时遇到了一个奇怪的“错误”。在今天之前,我已经在 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 加密例程产生影响。
【问题讨论】:
-
重复的存在并不意味着非随机性。 en.wikipedia.org/wiki/Birthday_paradox.
-
当然,根据定义,伪随机生成器根本不是随机的。
-
@NayukiMinase:
Math.random()生成一个双精度浮点数,但 OP 的相等性测试首先将这些数字转换为字符串,因此除非浏览器决定包含超过 15 个位置在其字符串表示形式中超过小数点后,OP 正在比较的值比 的熵少。 -
@delnan:您误读了链接到的答案。根据该答案,
100.0和100.1之间大约有 7,036,874,417,766 个双精度浮点数。在0.0和1.0之间,大约有 2 的 62 次幂的双精度浮点数。 -
@pseudosavant:你确定吗?我原以为
5555555.5555555555555的字符串化可能包括与5.5555555555555的字符串化相比相似数量的有效数字,并且小数点后的位数更少。
标签: javascript google-chrome random