是否可能Math.random()=== Math.random()

时间:2015-07-06 23:02:07

标签: javascript random

在JavaScript中,此表达式是否会在任何浏览器中评估为true?为什么或为什么不呢?

  Math.random() === Math.random()

注意:请按字面意思执行上述代码。我不是在问Math.random是否会生成重复值。

注2:没有猴子补丁

这个问题是关于Math.random()的内部实现,而不是关于随机数的性质。

5 个答案:

答案 0 :(得分:2)

是。只要数字精度有限制,随机数算法总是有可能发生冲突(生成两个相同的值)。

JavaScript的Math.random()函数返回一个等于0 <= N < 1的随机数。在现实世界中,N在理论上是无限的。在计算中,任何random()函数的结果的有限精度都会导致有限的结果集。

JavaScript使用带符号的64位双精度数,但random()函数不返回负值。因此,唯一返回值的最大范围等于32位无符号整数。

因此,Math.random() === Math.random()评估为真的几率在4294967296 ^ 2中约为1,或在1.8e19中为1,或在18 quintillion中为1。

为了实现这一点,它需要功能在一个循环中运行并且每秒执行10亿次(1 GHz)大约500年。或者你第一次尝试就可以幸运。 ; - )

答案 1 :(得分:1)

  

表达式Math.random() === Math.random()是否会在任何浏览器中评估为true?

是的,而且很可能已经发生了。

  

这个问题是关于Math.random()

的内部实施

嗯,没有一个实现,每个javascript引擎都实现了自己的实现。它是randomness cannot be trusted,但是常见的引擎确实使用了31,32,48或52位熵。
这意味着从两个连续调用(或任何两个调用)获得相同值的概率是2 -31 ,2 -32 等。这不是听起来很多,但2 31 只是互联网用户的数量......

哦,当然总有bugs like this one ......

答案 2 :(得分:1)

答案 3 :(得分:0)

对于合理的实施,概率大约为2 -53

这是因为生成随机双精度的常用方法是评估:randomUint53() / (double)(1L << 53)

示例代码:java.util.Random.nextDouble()

答案 4 :(得分:0)

当然可以,假设这样的事情是先行的:

Sheets("NameOfTheTab").Activate
Cells.Copy
Cells(1,1).PasteSpecial Paste:= xlPasteValues

否则,除非浏览器实现中存在错误,否则 理论上可能,但我仍然会回答&#34;它会评估为真&#34 34;是&#34;没有&#34;。它实际上发生的可能性太小了。