繁体   English   中英

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

[英]Is it possible for Math.random() === Math.random()

在 JavaScript 中,这个表达式会在任何浏览器中计算为 true 吗? 为什么或者为什么不?

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

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

注意2:没有猴子补丁

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

表达式Math.random() === Math.random()在任何浏览器中都会评估为真吗?

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

这个问题是关于Math.random()的内部实现

嗯,没有一个单一的实现,每个 javascript 引擎都实现了自己的一个。 它的随机性是不可信的,但普通引擎确实/确实使用了 31、32、48 或 52 位的熵。
这意味着从连续两次调用(或从任何两次调用中)获得相同值的概率是 2 -31 、 2 -32等。这听起来并不多,但 2 31只是互联网用户的数量…

哦,当然总是有这样的错误......

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

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;}

否则,除非浏览器实现中存在错误,否则理论上是可能的,但我仍然会说“这是否会评估为真”的答案是“否”。 现实发生的可能性太小了。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM