java - 在 Double 域中生成 Double

标签 java random

根据this question ,要创建给定范围内的 Double 数字,您可以使用:

Random r = new Random();
double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble();

我正在尝试使用上面提到的相同代码在双域[Double.MIN_VALUE, Double.MAX_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);
        }
    }
}

但是,即使经过多次迭代,我也只得到正数:

1.436326007111308E308
2.7068601271148073E307
1.266896721067985E308
8.273233207049513E306
1.3338832492644417E308
8.584898485464862E307
1.260909190772451E308
1.5511066198317899E307
1.2083062753983258E308
2.449979496663398E307
7.333729592027637E307
7.832069948910962E307
8.493365260900201E307
5.158907971928131E307
3.126231202546818E307
1.3576316635349233E308
1.0991793636673692E308
6.991662398870649E307

我的问题是:如何在 double 范围内生成 double 字?

最佳答案

结果不是您所期望的,因为 MIN_VALUE 是可能的最小 double 值。可能的最小 double 值为 -Double.MAX_VALUE(注意减号)。

但是你不能简单地使用lower = -Double.MAX_VALUE,因为那样的话,差异将不能表示为double,并且会溢出。

第一个想法是这样的

double d = random.nextDouble() * Double.MAX_VALUE;
if (random.nextBoolean()) d = -d;

覆盖全部可能的范围。

<小时/>

编辑:一个(可能是次要的)旁白:建议的方法也应该涵盖负double值,并且应该是正确的,因为每个可能的值要么以其正数出现,要么以其正数出现具有相同概率的负形式。但是,它将无法返回值 Double.MAX_VALUE(因为 Random#nextDouble() 返回的值严格小于1.0)。但根据 nextDouble 的实现,无论如何,可能会有 double 值永远不会出现在输出中。

关于java - 在 Double 域中生成 Double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24252699/

相关文章:

java - JFrame 不重绘

c# - 将两个值添加到组合框

python - 为什么 numpy.random.choice 这么慢?

java - 霍夫曼节点和 NullPointerException

java - 将日期转换为 LocalDate 在公元 200 年左右返回奇怪的结果

java - Swing:JPanel 内的 JTextField,重绘问题

java - 我应该更喜欢 ThreadLocalRandom 而不是 ThreadLocal<Random>?

c# - RandomNumberGenerator GetInt32 未定义

javascript - 生成随机值,保留返回值的历史记录

python - 如何在 python 中创建一个加密安全的随机数?