【问题标题】:Generate a random double in a range生成一个范围内的随机双精度
【发布时间】:2010-09-09 21:15:40
【问题描述】:

我有两个像下面这样的双打

double min = 100;
double max = 101;

使用随机生成器,我需要在最小值和最大值之间创建一个双精度值。

Random r = new Random();
r.nextDouble();

但是这里没有我们可以指定范围的地方。

【问题讨论】:

    标签: java random


    【解决方案1】:

    rangeMinrangeMax 之间生成一个随机值:

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

    【讨论】:

    • 这通常是正确的,但要注意它的局限性。如果您执行double rangeMax= Double.MAX_VALUE;double rangeMin= -rangeMax;,您将始终获得无限的回报。您可能需要检查Double.valueOf(rangeMax-rangeMin).isInfinite()
    • 请注意,如果该范围大于 0.0-1.0,则此结果通常会排除所需范围内的许多双精度值。如果所需的范围包含比范围 0.0-1.0 更多的值,则它们中的每一个都不会有一个值,并且它们永远不会生成。 (通过鸽巢原理!)。因为这个Tunaki's solution更好。
    • @Lii 它们每个都不会有一个值为什么不呢?
    • @K_7:例如说在 0.0 和 1.0 之间有 10,000 个不同的双精度值(实际上可能更多)。但是如果rangeMinrangeMax 之间的范围很大,那么它们之间可能有10,000,000 个不同的双精度值。 (rangeMax - rangeMin) * r.nextDouble() 的结果只会在可能的 10,000,000 个值中选择 10,000 个。 (我觉得这不是一个完美的解释,但也许它有点帮助......)
    • 啊,我明白了。基本上,乘以可以取一组有限值的数字不会改变该集合的大小。
    【解决方案2】:

    这个问题是在 Java 7 发布之前提出的,但现在,使用 Java 7(及更高版本)API 有另一种可能的方式:

    double random = ThreadLocalRandom.current().nextDouble(min, max);
    

    nextDouble 将返回一个介于最小值(包括)和最大值(不包括)之间的伪随机双精度值。边界不一定是int,可以是double

    【讨论】:

    • 调用需要 api 21
    • @XarEAhmer API 21 是什么?
    • 看起来他指的是Android。
    【解决方案3】:

    使用这个:

    double start = 400;
    double end = 402;
    double random = new Random().nextDouble();
    double result = start + (random * (end - start));
    System.out.println(result);
    

    编辑:

    new Random().nextDouble():随机生成一个介于 0 和 1 之间的数字。

    start:起始编号,将编号“向右”移动

    end - start:间隔。随机给你这个数字的 0% 到 100%,因为随机给你一个从 0 到 1 的数字。


    编辑 2: 谢谢@daniel 和@aaa bbb。我的第一个答案是错误的。

    【讨论】:

      【解决方案4】:
      import java.util.Random;
      
      public class MyClass {
           public static void main(String args[]) {
                Double min = 0.0;  // Set To Your Desired Min Value
                Double max = 10.0; // Set To Your Desired Max Value
                double x = (Math.random() * ((max - min) + 1)) + min;   // This Will Create A Random Number Inbetween Your Min And Max.
                double xrounded = Math.round(x * 100.0) / 100.0;   // Creates Answer To The Nearest 100 th, You Can Modify This To Change How It Rounds.
                System.out.println(xrounded);    // This Will Now Print Out The Rounded, Random Number.
           }
      }
      

      【讨论】:

        【解决方案5】:

        希望,这可能会有所帮助:Random Number Generators in Java


        分享一个完整的程序:

        import java.util.Random;
        
        public class SecondSplitExample
        {
            public static void main(String []arguments)
            {
                int minValue = 20, maxValue=20000;
                Random theRandom = new Random();
                double theRandomValue = 0.0;
                
                // Checking for a valid range-
                if( Double.valueOf(maxValue - minValue).isInfinite() == false ) 
                    theRandomValue = minValue + (maxValue - minValue) * theRandom.nextDouble();
                
                System.out.println("Double Random Number between ("+ minValue +","+ maxValue +") = "+ theRandomValue);
            }
        }
        

        这是 3 次运行的输出:

        Code>java SecondSplitExample
        Double Random Number between (20,20000) = 2808.2426532469476
        
        Code>java SecondSplitExample
        Double Random Number between (20,20000) = 1929.557668284786
        
        Code>java SecondSplitExample
        Double Random Number between (20,20000) = 13254.575289900251
        

        了解详情:

        【讨论】:

          【解决方案6】:
          Random random = new Random();
          double percent = 10.0; //10.0%
          if (random.nextDouble() * 100D < percent) {
              //do
          }
          

          【讨论】:

          • 我喜欢这样可以减少参数(相对于有一个最小值和最大值,只是有一个间隔)
          【解决方案7】:

          random 的主要思想是它返回一个伪随机值。 没有完全随机函数这样的东西,因此,使用相同种子的 2 个随机实例将在某些条件下返回相同的值。

          最好先查看函数文档以便理解它 (https://docs.oracle.com/javase/8/docs/api/java/util/Random.html)

          现在我们知道函数 nextDouble() 的返回值是一个介于 0.0 和 1.0 之间的伪随机值,我们可以利用它来发挥我们的优势。

          为了在 A 和 B 之间创建一个随机数,让边界有效 (A>B),我们需要: 1.找到A和B之间的范围,这样我们就可以知道我们有多少“步骤”。 2.使用random函数判断要走多少步(因为返回值在0.0到1.0之间你可以认为是“选择一个随机的增加百分比” 3.添加偏移量

          在我看来,你可以看到 mob 给了你最简单和最常用的方法

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

          double RandomValue = Offset + (Range)*(randomVal between 0.0-1.0)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-01
            • 2017-09-07
            • 2012-05-16
            • 2018-04-08
            • 1970-01-01
            相关资源
            最近更新 更多