Java随机双精度间隔[-10001000]
在java中,我有: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(
Random random = new Random();
double randomNum = random.nextDouble();
这将创建一个介于0和1之间的随机数。但是我想要一个介于-1000和1000之间的数字,我将如何缩放它
谢谢嗯,数学
double randomNum = (random.nextDouble()-0.5d) * 2000;
尝试以下算法:
这将为您提供该范围内的数字
double randomNum = (random.nextDouble() * 2000) -1000;
2种可能性:
请注意,可能性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;
}