[英]Is it possible for Math.random() === Math.random()
在 JavaScript 中,这个表达式会在任何浏览器中计算为 true 吗? 为什么或者为什么不?
Math.random() === Math.random()
注意:请按字面意思理解上面的代码。 我不是在问 Math.random 是否会生成重复值。
注意2:没有猴子补丁
这个问题是关于 Math.random() 的内部实现,而不是关于随机数的性质。
是的。 只要数值精度有限制,随机数算法总是有可能发生冲突(生成两个相同的值)。
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。
为了在实践中发生这种情况,需要函数在循环中运行并在大约 500 年内每秒执行 10 亿次(1 GHz)。 或者,您可能会在第一次尝试时就走运。 ;-)
当然可以,假设这样的事情事先运行:
Math.random = function () {return 4;}
否则,除非浏览器实现中存在错误,否则理论上是可能的,但我仍然会说“这是否会评估为真”的答案是“否”。 现实发生的可能性太小了。
不可能,根据 V8 (Chrome) 实现: https : //hackernoon.com/how-does-javascripts-math-random-generate-random-numbers-ef0de6a20131 。
对于合理的实现,它的概率大约为 2 -53 。
这是因为生成随机双randomUint53() / (double)(1L << 53)
的常用方法是计算: randomUint53() / (double)(1L << 53)
。
示例代码: java.util.Random.nextDouble() 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.