【问题标题】:Java Random double in interval [-1000, 1000]Java 随机双精度区间 [-1000, 1000]
【发布时间】:2012-01-09 16:17:25
【问题描述】:

在java中我有:

Random random = new Random();
double randomNum = random.nextDouble();

它创建一个介于 0 和 1 之间的随机数。但是我想要一个介于 -1000 和 1000 之间的数字,我将如何缩放它?

谢谢

【问题讨论】:

  • 您是否想要随机的doubleint 似乎有些混淆...您想要哪个?
  • 随机双倍,谢谢帮助。
  • 仅供参考:这里的所有函数都会产生[-1000, 1000),即你永远不会得到 1000,但你可以得到 -1000。

标签: java random


【解决方案1】:

2 种可能性:

  1. [较不密集]:将结果乘以 2000,然后减去 1000 从结果。它不会像可能性 2 那样“密集”。
  2. 在 [-1000,999] 范围内获取一个随机整数,并在其中添加一个随机双精度 范围 [0,1]。

请注意,可能性 2 可确保您的数字具有更好的随机性和更好的“密度”,但代价是 2 次随机调用 [这可能是广泛的,如果这是一个问题]。

【讨论】:

  • 你能解释一下为什么选项 1 是“[0,1] 中的密度较小”吗?我创建了一个桶宽为一的直方图(使用floor),它在中心周围看起来完全正常。
  • @ziggystar:双打并不都是实数。在 [0,1] 范围内有有限数量的双精度数。现在,假设在 [0,1] 范围内有 k 个双精度数。使用选项 1,您只能获得范围 [-1000,1000] 内的 k 个数字,而使用选项 2,您将获得 2000*k 个可能性!因此,它的随机性较低 - 某些数字可能不会出现在选项 1 中,但它们可以出现在选项 2 中。我的答案中的密度意味着两个数字之间的可能距离,选项 1 中的最小距离比选项 2 中的大得多,因此它密度较小。
  • 谢谢。我理解这一点,我想我对您的评论感到困惑,我将其解释为“仅在 0 和 1 之间密度较小”。
【解决方案2】:

嗯,数学?

double randomNum = (random.nextDouble()-0.5d) * 2000;

【讨论】:

  • 请注意,它的密度将低于 (0,1) 范围内的原始函数,因此随机性较小。
【解决方案3】:
Random random = new Random();
double randomNum = (random.nextDouble() * 2000.0d) - 1000.0d;

【讨论】:

  • 请注意,它的密度将低于 (0,1) 范围内的原始函数,因此随机性较小。
【解决方案4】:

试试这个算法:

  1. 生成一个 0 到 1 范围内的随机值。
  2. 将该值乘以 2000(所需范围的大小)。
  3. 从第 2 步的结果中减去 1000(将值移动到所需范围内)。

【讨论】:

    【解决方案5】:

    这会为您提供该范围内的数字

    double randomNum = (random.nextDouble() * 2000) -1000;
    

    【讨论】:

      【解决方案6】:

      这是一个通用函数,可用于将零和一之间的数字 (val01) 线性重新缩放到不同的范围 (min..max):

          public static double rescale(double val01, double min, double max) {
              return val01 * (max - min) + min;
          }
      

      【讨论】:

        【解决方案7】:
        public static double doubleBetween(double start, double end) {
            Random random = new Random();
        
            // We need 64 bits because double have 53 bits precision, so int is too short
            // We have now a value between 0 and Long.MAX_VALUE.
            long value = -1L;
            while (value < 0)
              value = Math.abs(random.nextLong()); // Caution, Long.MIN_VALUE returns negative !
        
        
            // Cast to double
            double valueAsDouble = (double) value;
        
            // Scale so that Long.MAX_VALUE is exactly 1 !
            double diff = (end-start)/(double) Long.MAX_VALUE;
        
        
            return start + valueAsDouble*diff;
        }
        

        这将给出正确的间隔,包括具有全双精度的两端。双打有一个特殊的 -0.0 值(负零),此例程不会给出。

        【讨论】:

          【解决方案8】:
          Random random = new Random();
          int randomNum = random.nextInt(2000) - 1000;
          

          【讨论】:

            【解决方案9】:
             public  static double randomInterval(double minValue,double maxValue){
                Random random = new Random();
                double r;
                do {
                    r = random.nextDouble();
                } while (r < minValue || r >= maxValue);
                return r;
            }
            

            示例:

            double a = randomInterval(-1000,1000) ;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-08-16
              • 1970-01-01
              • 1970-01-01
              • 2012-05-16
              • 2016-08-27
              • 2014-02-13
              • 1970-01-01
              相关资源
              最近更新 更多