Java的随机函数可以为零吗?
只是出于好奇,Math.random()可以归零吗?
例如,如果我有:
while (true){
if (Math.random() == 0)
return 1;
}
我真的会得到一个回报吗?还有一个舍入误差需要考虑,因为 Math.random() 返回一个双精度值。
我问是因为我的CS教授说random()从0到1(包括0),我一直认为它是排他性的。
只是出于好奇,Math.random()可以归零吗?
例如,如果我有:
while (true){
if (Math.random() == 0)
return 1;
}
我真的会得到一个回报吗?还有一个舍入误差需要考虑,因为 Math.random() 返回一个双精度值。
我问是因为我的CS教授说random()从0到1(包括0),我一直认为它是排他性的。
是的,真的可以。 创建一个带有种子的全局生成器并调用它。如果它的种子达到状态(并且它将,因为有完整的周期),则生成的下一个将是 。虽然运气不好,但你最终可能会在周期中得到错误的平价,因为国家进步了两次。运气不好,你可能不得不在循环终止之前生成2 ^ 47个随机数,因为我没有找到任何其他种子。Math.random()
java.util.Random
(System.currentTimeMillis() ^ 0x5DEECE66DL) & ((1L << 48) - 1)
nextDouble()
107048004364969L
java.util.Random
double
0.0
Random.nextDouble()
0.0
种子前进,就好像 by 和 doubles 是使用两个连续种子值的 26 和 27 个上位生成的。在示例中,接下来的两个种子值将为 和 。seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
0L
11L
如果您设法使用 创建全局生成器,您的代码将立即返回。您可以使用以下命令模拟此操作:System.currentTimeMillis()==107038380838084L
java.util.Random k = new java.util.Random(107038380838084L);
System.out.println(k.nextDouble()==0);