繁体   English   中英

如何在Java中生成指定范围之外的随机双数?

[英]How to generate random double number outside a specified range in Java?

有没有办法在指定范围之外生成随机双精度值?

我知道范围内有一个:

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

我需要一个超出范围的,例如

范围是 20 - 50,我想要一个低于 20 或高于 50 的数字。

有人可以建议吗?

也许类似(对于数字 1-20 和 50-100):

Random r = new Random();
double randomValue = r.nextDouble()*70;
if(randomValue>20) randomValue+=30;

它不是资源昂贵且易于理解。

你可以试试这样的想法:

Random rnd = new Random();
double x=0;
do{
    x = rnd.nextDouble()*100;
}while(x>20 && x<50 );

    System.out.println(x);
    }

您生成一个随机双精度(需要乘以 100,因为在 0 和 1 之间生成双返回值)并在结果 >20 和 <50 时循环

如果你想要一个double任何double ,特定范围之外,则可以采取的一个事实优点double由64位表示,并且可以任何64位值转换为一个doubleDouble.longBitsToDouble方法:

public static void main(String[] args) {
    Random r = new Random();

    double d;
    do {
        d = Double.longBitsToDouble(r.nextLong());
    } while (d >= 20 && d <= 50);

    System.out.println(d);
}

首先,你总是需要一些你正在生成的数字的上限,所以 'above rangeMax' 不会真正做到。 您基本上想要的是生成一个落入两个范围 [0,minRange] 或 [maxRange, maxValue] 之一的数字。

您可以使用“懒惰方法”,它只是生成一个介于 0 和 maxValue 之间的值,然后生成一个新的值,直到您继续使用它不落入 [minRange,maxRange] 范围内,或者您可以执行两步生成过程, 即生成一个随机数,决定您生成的是下限还是上限的数字,例如:

public static void main(String[] args) {
    double result  = (new Random().nextInt(2)) == 0 ? generateInRange(0, 20) : generateInRange(50, Double.MAX_VALUE);
}

private static double generateInRange(double min, double max) {
    return new Random().nextDouble() * (max-min) + min;
}

这确实为您提供了 50/50 的机会在下限和上限范围内结束,因此您可能需要对其进行调整。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM