在JavaScript中,此表达式是否会在任何浏览器中评估为true?为什么或为什么不呢?
Math.random() === Math.random()
注意:请按字面意思执行上述代码。我不是在问Math.random是否会生成重复值。
注2:没有猴子补丁
这个问题是关于Math.random()的内部实现,而不是关于随机数的性质。
答案 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)
不可能,根据 V8 (Chrome) 实现:https://hackernoon.com/how-does-javascripts-math-random-generate-random-numbers-ef0de6a20131。
答案 3 :(得分:0)
对于合理的实施,概率大约为2 -53 。
这是因为生成随机双精度的常用方法是评估:randomUint53() / (double)(1L << 53)
。
答案 4 :(得分:0)
当然可以,假设这样的事情是先行的:
Sheets("NameOfTheTab").Activate
Cells.Copy
Cells(1,1).PasteSpecial Paste:= xlPasteValues
否则,除非浏览器实现中存在错误,否则 理论上可能,但我仍然会回答&#34;它会评估为真&#34 34;是&#34;没有&#34;。它实际上发生的可能性太小了。