我知道有一个范围约随机另一个问题,但没有他们的答案的完成我想做的事情。 其实他们有我也有同样的错误。 我写了这个简单的函数来生成随机带的范围。
Random m_random = new Random();
...
public int RandomWithRange(int min, int max) {
return m_random.nextInt(max - min + 1) + min;
}
如果范围大于Integer.MAX_VALUE的更大,它抛出一个IllegalArgumentException:n必须为正数。 我知道它溢出,把为负数。 我的问题是如何处理的?
实施例的范围;
- [0,是Integer.MAX_VALUE]
- [Integer.MIN_VALUE的,是Integer.MAX_VALUE]
- [-100,Integer.MAX_VALUE的]
注:最小值和最大值必须具有包容性。
你的问题是, (max - min)
溢出,并给你一个负值。
您可以使用long
代替。
public int randomWithRange(int min, int max) {
return (int) ((m_random.nextLong() & Long.MAX_VALUE) % (1L + max - min)) + min;
}
你不能在这种情况下使用int。 你需要去的BigInteger 。 下面的构造你想要做什么(需要一些调整你的课程的需要):
BigInteger(int numBits, Random rnd)
构造一个随机生成的BigInteger,均匀地分布在范围0至(2numBits - 1),包括端值。
你有没有考虑得到一个随机双然后回铸造为int
return (int)(m_random.nextDouble() * ((double)max - (double)min) + min);
最“愚蠢的,但绝对正确”的解决方案,我能想到的:
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;
}