【问题标题】:How to generate random double number outside a specified range in Java?如何在Java中生成指定范围之外的随机双数?
【发布时间】:2018-02-12 14:26:14
【问题描述】:

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

我知道范围内有一个:

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

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

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

有人可以建议吗?

【问题讨论】:

  • 我不认为这是可能的,你可能需要写一个if statement 来检查生成的数字是否在你的范围内。如果是则生成另一个数字
  • 那么这些范围的外界是什么?
  • 懒惰的答案:生成随机数并丢弃范围内的随机数,反正我猜它会更快
  • 下次请指定超出范围 20 - 50 不算负无穷和正无穷

标签: java math random


【解决方案1】:

可能类似于(对于数字 1-20 和 50-100):

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

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

【讨论】:

    【解决方案2】:

    你可以试试这样的想法:

    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 和 时循环

    【讨论】:

    • 谢谢,我想现在就可以了 :)
    【解决方案3】:

    如果您想要一个超出特定范围的doubleany double,那么您可以利用double 由64 位表示的事实,并且您可以使用 Double.longBitsToDouble 方法将任何 64 位值转换为 double

    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);
    }
    

    【讨论】:

    • 仅当您完全不关心随机生成的值的分布时才使用此选项。这远非统一。
    • 当然不是。阅读 OP,它没有指定任何外部范围,也没有要求统一。
    • 您的解决方案因聪明和多样性而获得积分,但它很可能会让那些只是复制和粘贴您的代码而不知道自己在做什么的普通读者失败。明智的做法是警告人们这样做的确切含义,这样我们就不会最终得到与您的解决方案相关联的错误软件!
    【解决方案4】:

    首先,您总是需要为生成的数字设置一个上限,因此“高于 rangeMax”实际上不会。您基本上想要的是生成一个属于 [0,minRange] 或 [maxRange, maxValue] 两个范围之一的数字。

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

    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 的机会最终进入上下限,因此您可能需要对其进行调整。

    【讨论】:

    • 这会弄乱随机分布,因此它更有可能得到一个小数字而不是一个大数字。这可能是不可取的。
    • 是的,这就是我提到 50/50 机会的原因。如果你想让它均匀分布,你必须考虑范围大小并使用类似new Random().nextInt(minRange + (maxValue - maxRange)) &lt; minRange
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 2015-04-08
    • 1970-01-01
    相关资源
    最近更新 更多