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

时间:2016-09-21 17:17:03

标签: java random intervals

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

Random rand = new Random();
double increment = min + (max - min) * rand.nextDouble();

这将在间隔[min, max)上为您提供一个随机数,因为nextDouble在其返回的结果范围([0.0,1.0))中包含0。有没有一种很好的方法可以排除最小值,而是在(min, max)上提供一个随机数?

2 个答案:

答案 0 :(得分:5)

理论中,调用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支票。

答案 1 :(得分:4)

不是专门要求最低限度,而是要求包含它 - 但使用Math::nextUp最小值是下一个双倍值:

min = Math.nextUp(min);

双打是离散的,所以这类似于整数 - 土地,将(0, 10)改为[1, 10)