选择随机整数范围多于Integer.MAX_VALUE更大?(Choose random integ

2019-09-17 13:57发布

我知道有一个范围约随机另一个问题,但没有他们的答案的完成我想做的事情。 其实他们有我也有同样的错误。 我写了这个简单的函数来生成随机带的范围。

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的]

注:最小值和最大值必须具有包容性。

Answer 1:

你的问题是, (max - min)溢出,并给你一个负值。

您可以使用long代替。

public int randomWithRange(int min, int max) {
    return (int) ((m_random.nextLong() & Long.MAX_VALUE) % (1L + max - min)) + min;
}


Answer 2:

你不能在这种情况下使用int。 你需要去的BigInteger 。 下面的构造你想要做什么(需要一些调整你的课程的需要):

BigInteger(int numBits, Random rnd) 

构造一个随机生成的BigInteger,均匀地分布在范围0至(2numBits - 1),包括端值。



Answer 3:

你有没有考虑得到一个随机双然后回铸造为int

return (int)(m_random.nextDouble() * ((double)max - (double)min) + min);


Answer 4:

最“愚蠢的,但绝对正确”的解决方案,我能想到的:

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;
}


文章来源: Choose random integer in a range bigger than Integer.MAX_VALUE?
标签: java random