如何在开放区间(x,y)获得下一个随机翻倍

ric*_*i90 2 java random intervals

我知道半闭区间内随机数的基本算法是:

Random rand = new Random();
double increment = min + (max - min) * rand.nextDouble();
Run Code Online (Sandbox Code Playgroud)

这将在间隔上给出一个随机数,[min, max)因为它返回nextDouble的结果([0.0,1.0))范围内包含0 .有没有一种很好的方法来排除最小值,而是提供一个随机数(min, max)

And*_*eas 5

理论上,调用Math.nextUp(double d)应该这样做.

double minUp = Math.nextUp(min);
double increment = minUp + (max - minUp) * rand.nextDouble();
Run Code Online (Sandbox Code Playgroud)

实际上,乘法后的舍入可能仍然会导致min返回,因此重试循环会更好.鉴于确切min价值的罕见性,性能不会受到影响.

double increment;
do {
    increment = min + (max - min) * rand.nextDouble();
} while (increment <= min || increment >= max);
Run Code Online (Sandbox Code Playgroud)

只是为了它,我还添加了一张max支票.