Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.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 在Double域中生成Double_Java_Random - Fatal编程技术网

Java 在Double域中生成Double

Java 在Double域中生成Double,java,random,Java,Random,根据,要在给定范围内创建双倍数字,可以使用: Random r = new Random(); double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble(); 我正试图使用上面提到的相同代码在双域[double.MIN\u VALUE,double.MAX\u VALUE]中生成一个双精度数字: package test; import java.util.Random; public class Main {

根据,要在给定范围内创建双倍数字,可以使用:

Random r = new Random();
double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble();
我正试图使用上面提到的相同代码在双域
[double.MIN\u VALUE,double.MAX\u VALUE]
中生成一个双精度数字:

package test;

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        double lower = Double.MIN_VALUE;
        double upper = Double.MAX_VALUE;
        Random   rand = new Random();

        for (int i = 0; i < 200; i++) {
            double a = lower + (upper - lower) * rand.nextDouble();
            System.out.println(a);
        }
    }
}

我的问题是:如何在双精度范围内生成双精度数字?

double。最小值是可以表示为双精度的最小正值


它不是最大的负数。这将是
-Double。最大值

结果不是您所期望的,因为
MIN\u值
是最小的正值
双值。最小可能的
double
值是
-double.MAX\u值(注意减号)

但是您不能简单地使用
lower=-Double.MAX_值
,因为这样,差异将无法表示为
Double
,并且将溢出

第一个想法是

double d = random.nextDouble() * Double.MAX_VALUE;
if (random.nextBoolean()) d = -d;
覆盖所有可能的范围



编辑:A(可能是次要的)旁白:建议的方法也应涵盖负
值,并且应该是正确的,即每个可能的值以相同的概率以正或负的形式出现。但是,它将无法返回值
Double.MAX\u value
(因为
Random\nextDouble()
返回的值严格小于1.0)。但是基于
nextDouble
的实现,无论如何可能会有
两个
值,它们永远不会出现在输出中。

正如我在评论中所说的,其他人也说过,
最小值
是正的。但是,即使您使用
-Double.MAX_值
,在计算
上限-下限
时,您的计算将溢出双精度,因为结果将是最大双精度的两倍!解决这个问题的一个办法是:

val = Random.nextDouble();
return (val < 0.5) ? (-2 * val) * Double.MAX_VALUE : (2 * (val - 0.5)) * Double.MAX_VALUE;
val=Random.nextDouble();
返回值(val<0.5)?(-2*val)*Double.MAX_值:(2*(val-0.5))*Double.MAX_值;

阅读手册:
公共静态最终双精度最小值
一个常数,包含类型为2-1074的最小正非零值。它等于十六进制浮点文字0x0.0000000000001P-1022,也等于Double.longBitsToDouble(0x1L)。无论如何,当您将最小值设为负值时,您的代码将失败,因为。。。你猜对了。。。Java算法是以双精度进行的,最大双精度减去最大双精度的负数大于最大双精度。它会溢出来的。
val = Random.nextDouble();
return (val < 0.5) ? (-2 * val) * Double.MAX_VALUE : (2 * (val - 0.5)) * Double.MAX_VALUE;