如何在开区间 (x, y) 上获得下一个随机双精度数
how to get next random double on an open interval (x, y)
我知道半闭区间随机数的基本算法是:
Random rand = new Random();
double increment = min + (max - min) * rand.nextDouble();
这会给你一个区间 [min, max)
上的随机数,因为 nextDouble
在 returns 的结果范围 ([0.0,1.0)
) 中包含 0。有没有一种好方法可以排除最小值,而是在 (min, max)
?
上提供一个随机数
与其专门要求最小值,您可以要求包含它 - 但最小值是使用 Math::nextUp
:
的下一个 double 值
min = Math.nextUp(min);
双打是离散的,所以这类似于整数领域,将 (0, 10)
改写为 [1, 10)
。
在理论中,调用Math.nextUp(double d)
应该可以做到。
double minUp = Math.nextUp(min);
double increment = minUp + (max - minUp) * rand.nextDouble();
实际上,乘法后的舍入仍可能导致返回min
,因此重试循环会更好。鉴于精确 min
值的稀有性,性能不会受到影响。
double increment;
do {
increment = min + (max - min) * rand.nextDouble();
} while (increment <= min || increment >= max);
为了好玩,我还添加了一个 max
检查。
我知道半闭区间随机数的基本算法是:
Random rand = new Random();
double increment = min + (max - min) * rand.nextDouble();
这会给你一个区间 [min, max)
上的随机数,因为 nextDouble
在 returns 的结果范围 ([0.0,1.0)
) 中包含 0。有没有一种好方法可以排除最小值,而是在 (min, max)
?
与其专门要求最小值,您可以要求包含它 - 但最小值是使用 Math::nextUp
:
min = Math.nextUp(min);
双打是离散的,所以这类似于整数领域,将 (0, 10)
改写为 [1, 10)
。
在理论中,调用Math.nextUp(double d)
应该可以做到。
double minUp = Math.nextUp(min);
double increment = minUp + (max - minUp) * rand.nextDouble();
实际上,乘法后的舍入仍可能导致返回min
,因此重试循环会更好。鉴于精确 min
值的稀有性,性能不会受到影响。
double increment;
do {
increment = min + (max - min) * rand.nextDouble();
} while (increment <= min || increment >= max);
为了好玩,我还添加了一个 max
检查。