Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Random.nextDouble()是否可以返回包含的值?_Java_Random - Fatal编程技术网

Java Random.nextDouble()是否可以返回包含的值?

Java Random.nextDouble()是否可以返回包含的值?,java,random,Java,Random,我正在使用如下所示的方法。我希望nextDouble()返回间隔上的伪随机double值[-50.0,50.0),但是,在运行循环10亿次后,输出结果是最大值:49.99999995014588最小值:-49.9999991024878。我运行循环时没有对输出间隔进行任何操作,得到了最大值:0.99999999979311最小值:0.0。我觉得这很奇怪,因为我对0.0所做的一切返回的de>是将其乘以100.0,然后从中减去50.0。为什么下面的代码段从未精确返回-50.0 编辑:只是为了好玩,我

我正在使用如下所示的方法。我希望
nextDouble()
返回间隔上的伪随机
double
值[-50.0,50.0),但是,在运行循环10亿次后,输出结果是
最大值:49.99999995014588最小值:-49.9999991024878
。我运行循环时没有对输出间隔进行任何操作,得到了
最大值:0.99999999979311最小值:0.0
。我觉得这很奇怪,因为我对
0.0所做的一切返回的de>是将其乘以100.0,然后从中减去50.0。为什么下面的代码段从未精确返回-50.0

编辑:只是为了好玩,我又运行了5亿次循环,现在的输出是:
最大值:49.999999422232最小值:-49.9999996750944

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);
}
}
import java.util.Random;
公开课随机测试{
公共静态void main(字符串[]args){
双最大值=0;
双最小值=0;
随机数学=新随机();
对于(int a=0;a<100000000;a++){
double rand=math.nextDouble()*100.0-(100.0/2.0);
max=Math.max(max,rand);
最小值=数学最小值(最小值,兰德);
}
系统输出打印项次(“最大值:+max+”最小值:+min);
}
}

javadoc明确指出
nextDouble()
的上限是独占的,而不是包含的。这意味着
1.0
将不会被返回

根据javadoc,将返回
0.0
,概率约为1/254(即18014398509481984年的一次)

(它归结为确定对
next(27)
的两个连续调用是否返回零。如果您检查
next(int)
使用的LCNG的规范,这是可能的)


因此,您的代码不会命中
50.0
,因为它不能命中。它应该能够命中
-50.0
,但您可能需要按1.0E19次的顺序运行它。您只运行了5.0E8次。

nextDouble()
首先生成一个随机的
long
,即在数字-263和263-1之间均匀分布的整数。如果生成10亿个数字,仍然只能生成109/264=5.421 x 10-11的可能性,很小的一部分。因此,生成任何特定数字的几率都非常小


即使考虑四舍五入,可能性仍然很小。请注意,您的输出包含16个有效数字,这意味着您可以生成1015到1016个可能的十进制数字序列。如果您只生成其中109个,则生成任何特定数字的概率为10-7。

取自oracle文件:

public double nextDouble()统一返回下一个伪随机值 此随机数的分布双精度值介于0.0和1.0之间 发电机序列。下一个双机的总合同就是那个 双值,从0.0d范围内均匀(近似)选择 (包括)到1.0d(排除),是伪随机生成的,并且 返回

方法nextDouble由Random类实现,就像通过以下方式实现一样:

public double nextDouble(){return((长)下一个(26)下一个(27))

>/(双精度)(1L请注意,在没有偏移量的情况下运行时,可能得不到0.0。 您的“min”以0.0开头

只要对代码稍加修改(min=1),您就可以看到您并没有得到0.0(您可以,但可能性不大)

double max=0;
双最小=1;
随机数学=新随机();
对于(int a=0;a<100000000;a++){
double rand=math.nextDouble();
max=Math.max(max,rand);
最小值=数学最小值(最小值,兰德);
}
系统输出打印项次(“最大值:+max+”最小值:+min);

最大值:0.9999999989149039最小值:4.5566594941703897E-10

自己动手吧。有些东西对我有用:

public double nextDoubleInclusive()
{
    return myRandom.nextInt(Integer.MAX_VALUE) / (Integer.MAX_VALUE - 1.0);
}

关于文档的解释很好,但我不是问为什么不返回上限。@Adrian,我以为你想知道为什么它没有精确到50对吗?废话。我只是注意到我忘记了50.0前面的负数。你的答案对于我之前编辑它之前的问题是正确的。@Adrian如果需要下限的话然后你的操作会得到-50.0,而不是50。0@Saravana是的,我刚刚意识到我问为什么它没有达到50.0,而不是问为什么它没有达到-50.0。哎呀。这对我的答案没有任何影响。我不这么认为。只是想确定一下。
return (((long)next(27) << 27) + next(27))
>      / (double)(1L << 54);
    double max = 0;
    double min = 1;
    Random math = new Random();
    for(int a = 0; a < 1000000000; a++) {
        double rand = math.nextDouble();
        max = Math.max(max, rand);
        min = Math.min(min, rand);
    }
    System.out.println("maximum: " + max + " minimum: " + min);
public double nextDoubleInclusive()
{
    return myRandom.nextInt(Integer.MAX_VALUE) / (Integer.MAX_VALUE - 1.0);
}