我正在玩这个Random类的nextDouble()方法,如下所示.我希望在[-50.0,50.0]区间nextDouble()返回一个伪随机double值,然而,在运行循环10亿次后,输出结果出来了maximum: 49.99999995014588 minimum: -49.99999991024878.我在没有输出间隔操作的情况下运行循环,我得到了maximum: 0.9999999998979311 minimum: 0.0.我发现这很奇怪,因为我对0.0返回的所做的只是乘以100.0并从中减去50.0.为什么下面的代码片段永远不会返回-50.0?
编辑:为了好玩,我又循环了5亿次,输出现在是:maximum: 49.99999994222232 minimum: -49.999999996750944.
import java.util.Random;
public class randomTest{
public static void main(String[] args) {
double max = 0;
double min = 0;
Random math = new Random();
for(int a = 0; a < 1000000000; a++) {
double rand = math.nextDouble() * 100.0 - (100.0 / 2.0);
max = Math.max(max, rand);
min = Math.min(min, rand);
}
System.out.println("maximum: " + max + " minimum: " + min);
}
}
Run Code Online (Sandbox Code Playgroud)
javadoc明确指出,上限nextDouble()是排他性的,不包括在内.这意味着1.0不会被退回.
根据javadoc,0.0将被返回....概率大约为1 + 2 54.(这是18,014,398,509,481,984中的一次.)
(它归结为确定两个连续的调用是否next(27)将返回零.如果你检查使用的LCNG的规范,这是可能的next(int).)
所以,你的代码没有被击中,50.0因为它不能.它应该能够击中,-50.0 但你可能需要以1.0E19次的顺序运行它才能发生.你只运行了5.0E8次.