Как создать случайное int
значение в определенном диапазоне?
Я пробовал следующее, но они не работают:
Попытка 1:
randomNum = minimum + (int)(Math.random() * maximum);
// Bug: `randomNum` can be bigger than `maximum`.
Попытка 2:
Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum = minimum + i;
// Bug: `randomNum` can be smaller than `minimum`.
Ответы:
В Java 1.7 или более поздней версии стандартный способ сделать это заключается в следующем:
Смотрите соответствующий JavaDoc . Преимущество этого подхода заключается в том, что нет необходимости явно инициализировать экземпляр java.util.Random , который может стать источником путаницы и ошибок при неправильном использовании.
Однако, наоборот, нет способа явно установить начальное число, поэтому может быть трудно воспроизвести результаты в ситуациях, когда это полезно, таких как тестирование или сохранение состояний игры или тому подобное. В этих ситуациях может использоваться методика до Java 1.7, показанная ниже.
До Java 1.7 стандартный способ сделать это был следующим:
Смотрите соответствующий JavaDoc . На практике класс java.util.Random часто предпочтительнее, чем java.lang.Math.random () .
В частности, нет необходимости заново изобретать колесо генерации случайных целых чисел, когда в стандартной библиотеке имеется простой API для выполнения задачи.
источник
max
значение являетсяInteger.MAX_VALUE
возможным, возможно переполнение, приводящее кjava.lang.IllegalArgumentException
. Вы можете попробовать:randInt(0, Integer.MAX_VALUE)
. Кроме того, еслиnextInt((max-min) + 1)
возвращает самое высокое значение (я полагаю, довольно редко), оно не переполнится снова (предположим, что min и max - достаточно высокие значения)? Как бороться с такими ситуациями?ThreadLocalRandom
был добавлен в Java через 2 с половиной года после того, как этот вопрос был впервые задан. Я всегда твердо придерживался мнения, что управление экземпляром Random находится за рамками вопроса.Обратите внимание, что этот подход является более предвзятым и менее эффективным, чем
nextInt
подход, https://stackoverflow.com/a/738651/360211Один стандартный шаблон для достижения этой цели:
Функция библиотеки Java Math Math.random () генерирует двойное значение в диапазоне
[0,1)
. Обратите внимание, что этот диапазон не включает 1.Чтобы сначала получить определенный диапазон значений, необходимо умножить его на величину диапазона значений, который вы хотите охватить.
Это возвращает значение в диапазоне
[0,Max-Min)
, где «Макс-Мин» не включен.Например, если вы хотите
[5,10)
, вам нужно охватить пять целочисленных значений, чтобы вы использовалиЭто вернет значение в диапазоне
[0,5)
, где 5 не включено.Теперь вам нужно сместить этот диапазон до диапазона, на который вы нацеливаетесь. Вы делаете это, добавляя значение Min.
Теперь вы получите значение в диапазоне
[Min,Max)
. Следуя нашему примеру, это означает[5,10)
:Но это все еще не включает,
Max
и вы получаете двойное значение. Чтобы получитьMax
включенное значение, вам нужно добавить 1 к параметру диапазона,(Max - Min)
а затем обрезать десятичную часть путем приведения к типу int. Это достигается с помощью:И там у вас есть это. Случайное целочисленное значение в диапазоне
[Min,Max]
или согласно примеру[5,10]
:источник
Использование:
Целое число
x
теперь является случайным числом, которое имеет возможный результат5-10
.источник
Использование:
источник
С Java-8они представили метод
ints(int randomNumberOrigin, int randomNumberBound)
вRandom
классе.Например, если вы хотите сгенерировать пять случайных целых (или одно) в диапазоне [0, 10], просто выполните:
Первый параметр указывает только размер
IntStream
сгенерированного (который является перегруженным методом того, который производит неограниченныйIntStream
).Если вам нужно сделать несколько отдельных вызовов, вы можете создать бесконечный примитивный итератор из потока:
Вы также можете сделать это для
double
иlong
значения. Я надеюсь, что это помогает! :)источник
streamSize
первого приведенного параметра этого методаstreamSize !=0
? Какая разница, еслиstreamSize
дано 1/2 / n?Вы можете отредактировать свой второй пример кода:
источник
Достаточно будет небольшой модификации вашего первого решения.
Смотрите больше здесь для реализации
Random
источник
ThreadLocalRandom
эквивалент классаjava.util.Random
для многопоточной среды. Генерация случайного числа осуществляется локально в каждом из потоков. Таким образом, мы имеем лучшую производительность, уменьшая конфликты.x
,y
- интервалы, например (1,10)источник
Math.Random
Класс в Java является 0 на основе. Итак, если вы напишите что-то вроде этого:x
будет между0-9
включительно.Итак, учитывая следующий массив
25
элементов, код для генерации случайного числа между0
(основанием массива) иarray.length
будет:Так
i.length
как вернется25
,nextInt( i.length )
вернет число в диапазоне0-24
. Другой вариант,Math.Random
который работает таким же образом.Для лучшего понимания, проверьте сообщение на форуме Случайные интервалы (archive.org) .
источник
index
Переменная не повлияет на результат случайного числа. Вы можете инициализировать его любым удобным для вас способом, не беспокоясь об изменении результата. Надеюсь это поможет.int index = rand.nextInt(i.Length);
int index; \n index = rand...
если увлекаюсь объявлениями и присваиваниями на разных строках. Некоторые стандарты кодирования являются более строгими (и без очевидной цели), чем другие.Прости меня за привередливость, но решение, предложенное большинством, то есть
min + rng.nextInt(max - min + 1))
кажется опасным из-за того, что:rng.nextInt(n)
не может достичьInteger.MAX_VALUE
.(max - min)
может вызвать переполнение, когдаmin
отрицательно.Надежное решение вернет правильные результаты для любого в
min <= max
пределах [Integer.MIN_VALUE
,Integer.MAX_VALUE
]. Рассмотрим следующую наивную реализацию:Хотя это неэффективно, обратите внимание, что вероятность успеха в
while
цикле всегда будет 50% или выше.источник
Это можно сделать, просто выполнив утверждение:
Ниже его исходный код
Randomizer.java
Это просто чисто и просто.
источник
Интересно, подойдет ли какой-либо из методов генерации случайных чисел, предоставляемых библиотекой Apache Commons Math .
Например:
RandomDataGenerator.nextInt
илиRandomDataGenerator.nextLong
источник
Давайте возьмем пример.
Предположим, я хочу сгенерировать число от 5 до 10 :
Дайте нам понять это ...
источник
источник
Сгенерируйте случайное число для разницы min и max, используя метод nextint (n), а затем добавьте min число к результату:
источник
Я использую это:
Вы можете привести его к Integer, если хотите.
источник
new Random
(проверьте JavaDoc): «Создает новый генератор случайных чисел. Этот конструктор устанавливает начальное значение генератора случайных чисел на значение, которое, скорее всего, будет отличаться от любого другого вызова этого конструктора». Очень вероятно, может просто использовать текущее время в качестве семени. Если это время использует миллисекунды, то современные компьютеры достаточно быстры, чтобы генерировать одинаковое число. Но помимо этого 2147483647 естьInteger.MAX_VALUE
; вывод, очевидно, зависит от ввода, который вы не указали.Джошуа Блох. Эффективная Java. Третье издание.
Начиная с Java 8
Для пулов объединений и параллельных потоков использование
SplittableRandom
, как правило, более быстрое, обладает лучшей статистической независимостью и свойствами однородности по сравнению сRandom
.Для генерации случайного числа
int
в диапазоне[0, 1_000]:
Для генерации случайного
int[100]
массива значений в диапазоне[0, 1_000]:
Чтобы вернуть поток случайных значений:
источник
.parallel()
? Мне кажется, что генерация 100 случайных чисел была бы слишком тривиальной, чтобы оправдать параллелизм.parallel
обработки). Кстати, для массива1_000_000
элементовparallel
версия на моей машине была в 2 раза быстрее по сравнению с последовательной.Просто используйте класс Random :
источник
Эти методы могут быть удобны в использовании:
Этот метод возвратит случайное число между предоставленным минимальным и максимальным значением:
и этот метод возвратит случайное число из предоставленного минимального и максимального значения (поэтому сгенерированное число также может быть минимальным или максимальным числом):
источник
// Since the random number is between the min and max values, simply add 1
, Почему? Мин не считается? Обычно диапазон составляет [min, max), где min включено, а max исключено. Неправильный ответ, проголосовал вниз.min + 1
будет в два раза чаще, чем другое число, которое будет результатомgetRandomNumberBetween
!В случае броска кубика это будет случайное число от 1 до 6 (не от 0 до 6), поэтому:
источник
Или взгляните на RandomUtils от Apache Commons .
источник
Double.valueOf(Math.random()*(maximum-minimun)).intValue()
это довольно запутанный (и неэффективный) способ сказать(int)(Math.random()*(maximum-minimun))
…Вот полезный класс для генерации случайных
ints
значений в диапазоне с любой комбинацией включающих / исключающих границ:источник
Чтобы сгенерировать случайное число «между двумя числами», используйте следующий код:
Это дает вам случайное число от 1 (включительно) до 11 (исключение), поэтому инициализируйте значение upperBound, добавив 1. Например, если вы хотите сгенерировать случайное число от 1 до 10, инициализируйте число upperBound с 11 вместо 10.
источник
Вы можете достичь этого кратко в Java 8:
источник
источник
Другой вариант - просто использовать Apache Commons :
источник
Я нашел этот пример Генерация случайных чисел :
Этот пример генерирует случайные целые числа в определенном диапазоне.
Пример запуска этого класса:
источник
Лучше использовать SecureRandom , чем просто Random.
источник
private static int SecureRandom rand = new SecureRandom();
static {
rand.setSeed(...);
}
SecureRandom
, это будет посеяно системой. Прямой вызовsetSeed
очень опасен, он может заменить (действительно случайное) семя датой. И это, конечно же, не приведет к томуSecureRandom
, что любой может угадать время и попытаться заснять свойSecureRandom
экземпляр этой информацией.Вот простой пример, который показывает, как генерировать случайное число из закрытого
[min, max]
диапазона, в то время какmin <= max is true
Вы можете использовать его как поле в классе отверстий, также имея все
Random.class
методы в одном местеПример результатов:
Источники:
источник
Это работает нормально.
источник