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

Как создать randomNum = minimum + (int)(Math.random() * maximum); // Bug: `randomNum` can be bigger than `maximum`. значение int в определенном диапазоне?

Я пробовал следующее, но это не работает:

Попытка 1:

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

Попытка 2:

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

java,random,integer,java-8,

2951

Ответов: 30


3297 ов
+150

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

nextInt

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

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

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

[0,1)

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

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


1339

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

Один стандартный шаблон для этого:

Math.random() * ( Max - Min )

Функция библиотеки Java Math Math.random () генерирует значение [0, Max-Min] в диапазоне [5,10). Обратите внимание, что этот диапазон не включает 1.

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

Math.random() * 5

Это возвращает значение в диапазоне [0,5), где 'Min + (Math.random () * (Max - Min)) -Min' не входит.

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

[5,10)

Это вернет значение в диапазоне 5 + (Math.random() * (10 - 5)) , где 5 не включено.

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

Max

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

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

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

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

И вот он у вас есть. Случайное целочисленное значение в диапазоне Random ran = new Random(); int x = ran.nextInt(6) + 5; или в примере x:

5-10

313 ов

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

minimum + rn.nextInt(maxValue - minvalue + 1)

Целое число xтеперь является случайным числом, которое имеет возможный результат ints(int randomNumberOrigin, int randomNumberBound).


125

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

Random

102

С помощью они вводили метод Random r = new Random(); int[] fiveRandomNumbers = r.ints(5, 0, 11).toArray(); int randomNumber = r.ints(1, 0, 11).findFirst().getAsInt(); в Randomклассе.

Например, если вы хотите сгенерировать пять случайных целых чисел (или один) в диапазоне [0, 10], просто выполните:

IntStream

Первый параметр указывает только размер IntStreamсгенерированного (который является перегруженным методом того, который создает неограниченный public final class IntRandomNumberGenerator { private PrimitiveIterator.OfInt randomIterator; /** * Initialize a new random number generator that generates * random numbers in the range [min, max] * @param min - the min value (inclusive) * @param max - the max value (inclusive) */ public IntRandomNumberGenerator(int min, int max) { randomIterator = new Random().ints(min, max + 1).iterator(); } /** * Returns a random number in the range (min, max) * @return a random number in the range (min, max) */ public int nextInt() { return randomIterator.nextInt(); } } ).

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

double

Вы также можете сделать это для doubleи longзначений.

Надеюсь, поможет! :)

Java, случайным образом, целое число, Java-8,
Похожие вопросы
Яндекс.Метрика