如何在特定范围内生成随机int值?

以下方法存在与整数溢出相关的错误:

randomNum = minimum + (int)(Math.random() * maximum);
// Bug: `randomNum` can be bigger than `maximum`.
Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum =  minimum + i;
// Bug: `randomNum` can be smaller than `minimum`.

当前回答

请原谅我过于挑剔,但大多数人建议的解决方案,即min+rng.nextInt(max-min+1),似乎很危险,因为:

rng.nextInt(n)无法达到整数.MAX_VALUE。当min为负值时,(max-min)可能会导致溢出。

万无一失的解决方案将为[Integer.min_VALUE,Integer.max_VALUE]内的任何min<=max返回正确的结果。请考虑以下简单的实现:

int nextIntInRange(int min, int max, Random rng) {
   if (min > max) {
      throw new IllegalArgumentException("Cannot draw random int from invalid range [" + min + ", " + max + "].");
   }
   int diff = max - min;
   if (diff >= 0 && diff != Integer.MAX_VALUE) {
      return (min + rng.nextInt(diff + 1));
   }
   int i;
   do {
      i = rng.nextInt();
   } while (i < min || i > max);
   return i;
}

尽管效率低下,但请注意while循环中成功的概率始终为50%或更高。

其他回答

范围[最小值最大值](含)内的随机数:

int randomFromMinToMaxInclusive = ThreadLocalRandom.current()
        .nextInt(min, max + 1);
int random = minimum + Double.valueOf(Math.random()*(maximum-minimum )).intValue();

或者看看Apache Commons的RandomUtils。

使用这些方法可能很方便:

此方法将返回提供的最小值和最大值之间的随机数:

public static int getRandomNumberBetween(int min, int max) {
    Random foo = new Random();
    int randomNumber = foo.nextInt(max - min) + min;
    if (randomNumber == min) {
        // Since the random number is between the min and max values, simply add 1
        return min + 1;
    } else {
        return randomNumber;
    }
}

并且该方法将从所提供的最小值和最大值返回随机数(因此生成的数也可以是最小值或最大值):

public static int getRandomNumberFrom(int min, int max) {
    Random foo = new Random();
    int randomNumber = foo.nextInt((max + 1) - min) + min;

    return randomNumber;
}

您可以使用Random类生成随机数,然后使用.nextInt(maxNumber)生成随机数。maxNumber是生成随机数时所需的最大值。请记住,Random类给你的是0到maxNumber-1的数字。

Random r = new Random();
int i = r.nextInt();

另一种方法是使用Math.Random()类,许多学校的课程都要求您使用该类,因为它更高效,而且您不必声明新的Random对象。要使用Math.random()获取随机数,请键入:

Math.random() * (max - min) + min;

我只是使用Math.random()生成一个随机数,然后将其乘以一个大数,比方说10000。因此,我得到一个介于0到10000之间的数字,并将其称为I。现在,如果我需要介于(x,y)之间的数字时,请执行以下操作:

i = x + (i % (y - x));

所以,所有的i都是x和y之间的数字。

要消除注释中指出的偏差,而不是将其乘以10000(或大数字),请将其乘以(y-x)。