Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么谷歌浏览器';随机数发生器不是那个随机数吗?_Javascript_Google Chrome_Random - Fatal编程技术网

Javascript 为什么谷歌浏览器';随机数发生器不是那个随机数吗?

Javascript 为什么谷歌浏览器';随机数发生器不是那个随机数吗?,javascript,google-chrome,random,Javascript,Google Chrome,Random,今天我在各种浏览器中运行一些单元测试时遇到了一个奇怪的“bug”。在今天之前,我已经在Firefox中运行了很多次测试,甚至IE,但显然还没有Chrome(v19开发版)。当我在Chrome中运行它们时,它始终没有通过一次测试,因为我计算的两个值不匹配 当我真正深入研究正在发生的事情时,我意识到问题在于我假设如果我用100000Math.random()值填充一个数组,那么它们都是唯一的(不会有任何冲突)。事实证明,在Chrome中这是不正确的 在Chrome中,我始终得到至少两对匹配10000

今天我在各种浏览器中运行一些单元测试时遇到了一个奇怪的“bug”。在今天之前,我已经在Firefox中运行了很多次测试,甚至IE,但显然还没有Chrome(v19开发版)。当我在Chrome中运行它们时,它始终没有通过一次测试,因为我计算的两个值不匹配

当我真正深入研究正在发生的事情时,我意识到问题在于我假设如果我用100000
Math.random()
值填充一个数组,那么它们都是唯一的(不会有任何冲突)。事实证明,在Chrome中这是不正确的

在Chrome中,我始终得到至少两对匹配100000的值。Firefox和IE9从未发生过冲突。下面是我为测试它而编写的JSFIDLE,它在数组中创建1M
Math.random()
条目:


有人知道为什么用于
Math.random
的Chrome伪随机数生成器不是那么随机吗?这似乎对任何曾经在V8中使用
Math.random

显然是Math.random()的客户端js加密例程都有影响(过去甚至没有正确地将所有这些例程随机化)。对于32位,碰撞概率达到50%,大约为2^16=65k值…

其他答案已经解释了这个问题。如果您希望在JavaScript中生成更好的伪随机数,我建议您从这个页面开始:

我适应了我用来在浏览器中生成UUID的脚本,并且在测试中没有冲突

2013年10月22日更新 链接到上面的页面不再有效。以下是从Wayback机器到快照的链接:

这里有一个指向Node.js模块的链接,其中包括Alea.js:

参见:

如果我们独立分析第一个子生成器,我们会发现它有32位的内部状态。它不是一个全循环发电机 — 其实际周期长度约为5.9亿(18030*2)⁵-1、数学很复杂,但这里和这里都有解释,或者你可以相信我)。因此,使用此生成器最多只能生成5.9亿个不同的请求标识符。如果它们是随机选择的,则在仅生成30000个标识符后,发生冲突的可能性将50%


重复项的存在并不意味着非随机性。当然,根据定义,伪随机生成器一点也不随机。@NayukiMinase:
Math.random()
生成一个双精度浮点数,但OP的相等性测试是先将这些数字转换成字符串,因此,除非浏览器决定在其字符串表示中包含超过小数点后15位的内容,否则OP比较的值的熵要小得多。@delnan:您误读了链接的答案。根据这个答案,大约有7036874417766个双精度浮点数介于
100.0
100.1
之间。在
0.0
1.0
之间,大约有62个双精度浮点数的二次方。@pseudosavant:你确定吗?我本以为
55555.5555555
的字符串化可能包括与
5.55555
的字符串化类似的有效数字,小数点后的位数更少。55555@BrianBallsun Stanton:的确如此。我已经添加了一个指向该页面快照的链接。等等,该页面现在也已关闭:(@user1544793:找到了另一个。这在中有更直接的地址。