Вопрос-ответ

How do I generate random integers within a specific range in Java?

Как мне сгенерировать случайные целые числа в определенном диапазоне в Java?

Как мне сгенерировать случайное 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`.
Переведено автоматически
Ответ 1

В Java 1.7 или более поздней версии стандартный способ сделать это следующий:

import java.util.concurrent.ThreadLocalRandom;

// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = ThreadLocalRandom.current().nextInt(min, max + 1);

Смотрите соответствующий JavaDoc . Преимущество этого подхода в том, что нет необходимости явно инициализировать java.util .Случайный экземпляр, который может быть источником путаницы и ошибок при ненадлежащем использовании.

Однако, наоборот, нет способа явно задать начальное значение, поэтому может быть трудно воспроизвести результаты в ситуациях, когда это полезно, таких как тестирование или сохранение состояний игры или подобных. В таких ситуациях можно использовать технику, разработанную до Java 1.7, показанную ниже.

До Java 1.7 стандартный способ сделать это был следующим:

import java.util.Random;

/**
* Returns a pseudo-random number between min and max, inclusive.
* The difference between min and max can be at most
* <code>Integer.MAX_VALUE - 1</code>.
*
* @param min Minimum value
* @param max Maximum value. Must be greater than min.
* @return Integer between min and max, inclusive.
* @see java.util.Random#nextInt(int)
*/

public static int randInt(int min, int max) {

// NOTE: This will (intentionally) not run as written so that folks
// copy-pasting have to think about how to initialize their
// Random instance. Initialization of the Random instance is outside
// the main scope of the question, but some decent options are to have
// a field that is initialized once and then re-used as needed or to
// use ThreadLocalRandom (if using at least Java 1.7).
//
// In particular, do NOT do 'Random rand = new Random()' here or you
// will get not very good / not very random results.
Random rand;

// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = rand.nextInt((max - min) + 1) + min;

return randomNum;
}

Смотрите соответствующий JavaDoc. На практике java.util .Класс Random часто предпочтительнее, чем java.lang.Math.random().

В частности, нет необходимости изобретать колесо генерации случайных целых чисел, когда в стандартной библиотеке есть простой API для выполнения задачи.

Ответ 2

Обратите внимание, что этот подход более предвзятый и менее эффективный, чем nextInt подход, https://javalang.ru/a/738651/360211

Одним из стандартных шаблонов для достижения этой цели является:

Min + (int)(Math.random() * ((Max - Min) + 1))

Функция математической библиотеки Java Math.random() генерирует двойное значение в диапазоне [0,1). Обратите внимание, что в этот диапазон не входит 1.

Чтобы сначала получить определенный диапазон значений, вам нужно умножить на величину диапазона значений, который вы хотите охватить.

Math.random() * ( Max - Min )

Это возвращает значение в диапазоне [0,Max-Min), где 'Max-Min' не включено.

Например, если вы хотите [5,10), вам нужно покрыть пять целых значений, поэтому вы используете

Math.random() * 5

Это вернет значение в диапазоне [0,5), где 5 не включено.

Теперь вам нужно сместить этот диапазон до диапазона, на который вы ориентируетесь. Вы делаете это, добавляя минимальное значение.

Min + (Math.random() * (Max - Min))

Теперь вы получите значение в диапазоне [Min,Max). Следуя нашему примеру, это означает [5,10):

5 + (Math.random() * (10 - 5))

Но это все еще не включает Max и вы получаете двойное значение. Чтобы получить включенное Max значение, вам нужно добавить 1 к вашему параметру range (Max - Min), а затем усечь десятичную часть путем преобразования в int . Это достигается с помощью:

Min + (int)(Math.random() * ((Max - Min) + 1))

И вот оно. Случайное целое значение в диапазоне [Min,Max] или в соответствии с примером [5,10]:

5 + (int)(Math.random() * ((10 - 5) + 1))
Ответ 3

Использование:

Random ran = new Random();
int x = ran.nextInt(6) + 5;

Целое число x теперь является случайным числом, которое имеет возможный результат 5-10.

Ответ 4

Использование:

minValue + rn.nextInt(maxValue - minValue + 1)
java