Java随机双精度间隔[-10001000]

Java随机双精度间隔[-10001000],java,random,Java,Random,在java中,我有: Random random = new Random(); double randomNum = random.nextDouble(); 这将创建一个介于0和1之间的随机数。但是我想要一个介于-1000和1000之间的数字,我将如何缩放它 谢谢嗯,数学 double randomNum = (random.nextDouble()-0.5d) * 2000; 尝试以下算法: 生成0到1范围内的随机值 将该值乘以2000(所需范围的大小) 从步骤2的结果中减去1000(

在java中,我有:

Random random = new Random();
double randomNum = random.nextDouble();
这将创建一个介于0和1之间的随机数。但是我想要一个介于-1000和1000之间的数字,我将如何缩放它

谢谢

嗯,数学

double randomNum = (random.nextDouble()-0.5d) * 2000;
尝试以下算法:

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

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

    double randomNum = (random.nextDouble() * 2000) -1000;
    
    2种可能性:

  • [低密度]:将结果乘以2000,再减去1000 从结果来看。它不会像可能性2那样“密集”
  • 获取[-1000999]范围内的随机整数,然后添加一个随机双精度整数 范围[0,1]

  • 请注意,可能性2确保了更好的随机性和更好的数字“密度”,代价是2次随机调用[如果这是一个问题,可能会扩大]。

    这里有一个通用函数,您可以使用它将0到1之间的数字(
    val01
    )线性重新缩放到不同的范围(
    min
    max
    ):

    Random random = new Random();
    int randomNum = random.nextInt(2000) - 1000;
    
    public static doubleBetween(双起点、双终点){
    随机=新随机();
    //我们需要64位,因为double有53位的精度,所以int太短了
    //现在有一个介于0和Long.MAX_值之间的值。
    长值=-1L;
    while(值<0)
    value=Math.abs(random.nextLong());//注意,Long.MIN_值返回负值!
    //加倍
    double value双精度=(双精度)值;
    //缩放以使Long.MAX_值正好为1!
    double diff=(结束-开始)/(双)Long.MAX_值;
    返回开始+值双*差;
    }
    

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

    注意,它的密度将低于范围(0,1)中的原始函数,因此随机性也会降低。注意,它的密度将低于范围(0,1)中的原始函数,这样就不那么随机了。至于你是想要一个随机的
    double
    ,还是
    int
    。。。你想要哪个?一个随机双精度,谢谢你的帮助。仅供参考:这里的所有函数都产生
    [-10001000)
    即,你永远不会得到1000,但你可以得到-1000。你能解释为什么选项1“在[0,1]中密度较低吗?我创建了一个桶宽为1的直方图(使用
    floor
    )中心周围看起来完全正常。@ziggystar:双精度不都是实数。在[0,1]范围内有有限数量的双精度。现在,假设在[0,1]范围内有k个双精度数字。使用选项1,您的范围[-10001000]内只有k个数字,而选项2则有2000*k的可能性!因此,它的随机性较小-一些数字可能不会出现在选项1中,但它们可以出现在选项2中。我的答案中的密度意味着两个数字之间的可能距离,选项1中的最小距离比选项2中的大得多,因此密度较小。谢谢。我理解这一点,我认为我我被你的评论弄糊涂了,我把它解释为“只有在0到1之间密度较低”。@user963602:请多加小心。你的大多数帖子都有明显的拼写错误。
    Random random = new Random();
    int randomNum = random.nextInt(2000) - 1000;
    
        public static double rescale(double val01, double min, double max) {
            return val01 * (max - min) + min;
        }
    
    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;
    }