我知道在一个范围内还有另外一个关于随机的问题,但他们的答案都没有完成我想要做的事情。实际上他们有同样的错误。我写了这个简单的函数来生成随机范围。
Random m_random = new Random();
...
public int RandomWithRange(int min, int max) {
return m_random.nextInt(max - min + 1) + min;
}
如果range大于Integer.MAX_VALUE,则抛出IllegalArgumentException:n必须为正数。我知道它溢出并转向负数。我的问题是如何处理?
示例范围;
注意:min和max必须包含在内。
答案 0 :(得分:6)
在这种情况下你不能使用int。您需要使用BigInteger。以下构造函数可以满足您的需求(当然需要根据您的需要进行调整):
BigInteger(int numBits, Random rnd)
构造一个随机生成的BigInteger,均匀分布 范围0到(2numBits - 1),包括在内。
答案 1 :(得分:4)
您遇到的问题是(max - min)
溢出并为您提供负值。
您可以使用long
代替。
public int randomWithRange(int min, int max) {
return (int) ((m_random.nextLong() & Long.MAX_VALUE) % (1L + max - min)) + min;
}
答案 2 :(得分:2)
您是否考虑过随机加倍然后转回int
return (int)(m_random.nextDouble() * ((double)max - (double)min) + min);
答案 3 :(得分:0)
我能想到的最“愚蠢但绝对正确”的解决方案:
if (max - min + 1 > 0) // no overflow
return delta + random.nextInt(max - min + 1);
else {
int result;
do {
result = random.nextInt();
} while (result < min || result > max);
// finishes in <= 2 iterations on average
return result;
}