我知道半闭区间内随机数的基本算法是:
Random rand = new Random();
double increment = min + (max - min) * rand.nextDouble();
这将在间隔[min, max)
上为您提供一个随机数,因为nextDouble
在其返回的结果范围([0.0,1.0)
)中包含0。有没有一种很好的方法可以排除最小值,而是在(min, max)
上提供一个随机数?
答案 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)
。