Java的随机函数可以为零吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (23)

出于好奇,Math.random()可以是零吗?

例如,如果我有:

while (true){
  if (Math.random() == 0)
    return 1;
}

我真的会得到一个回报吗?还有四舍五入错误需要考虑,因为Math.random()返回一个double。

提问于
用户回答回答于

根据文档,“以正号返回双值,大于或等于0.0且小于1.0。” 这意味着它可以为零。

它在上界唯一的(不可能是1),所以也许这就是你的困惑来自。

用户回答回答于

是的,它确实可以。Math.random()创建一个java.util.Random带有种子的全局生成器(System.currentTimeMillis() ^ 0x5DEECE66DL) & ((1L << 48) - 1)并呼吁nextDouble()它。如果它的种子达到了状态107048004364969L(并且它将会,因为java.util.Random有完整的时期),下一个double生成的将是0.0。虽然运气不好,但最终可能会在周期中出现错误的平价,因为这 Random.nextDouble()会使国家进步两次。如果运气不好,你可能必须在循环结束之前生成2 ^ 47个随机数字,因为我没有找到任何其他种子0.0

种子前进,就好像通过seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1); 使用两个连续种子值的26和27个高位来生成双精度值。在示例中,两个下种子值将是0L11L

如果您设法创建全局生成器System.currentTimeMillis()==107038380838084L,您的代码将立即返回。你可以用下面的方法进行模拟:

java.util.Random k = new java.util.Random(107038380838084L); System.out.println(k.nextDouble()==0);

扫码关注云+社区