如何在开区间 (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 检查。