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

2022-09-02 14:15:32

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

例如,如果我有:

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

我真的会得到一个回报吗?还有一个舍入误差需要考虑,因为 Math.random() 返回一个双精度值。

我问是因为我的CS教授说random()从0到1(包括0),我一直认为它是排他性的。


答案 1

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

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

如果您设法使用 创建全局生成器,您的代码将立即返回。您可以使用以下命令模拟此操作:System.currentTimeMillis()==107038380838084L

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


答案 2

根据文档,“返回一个带有正号的双精度值,大于或等于 0.0 且小于 1.0。这意味着它可以为零。

正如Hank所写的它在上边界上是排他性的(永远不可能是1),所以也许这就是你的困惑的来源:-)。


推荐