Дополнительно
Как генерировать случайные целые числа в определенном диапазоне в Java?
Как сгенерировать случайное значение 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`.
3359
20
В Java 1.7 или более поздней версии стандартный способ сделать это следующий:
См. соответствующий JavaDoc. Преимуществом этого подхода является отсутствие необходимости явной инициализации экземпляра java.util.Random, который может стать источником путаницы и ошибок при неправильном использовании.
Однако, наоборот, нет способа явно установить семя, поэтому может быть трудно воспроизвести результаты в ситуациях, когда это полезно, например, при тестировании или сохранении состояний игры и т.п. В таких ситуациях можно использовать технику, существовавшую до версии Java 1.7, показанную ниже.
До версии Java 1.7 стандартный способ сделать это был следующим:
См. соответствующий JavaDoc. На практике класс java.util.Random часто предпочтительнее java.lang.Math.random().
В частности, нет необходимости заново изобретать колесо генерации случайных целых чисел, когда есть простой API в стандартной библиотеке для выполнения этой задачи.
Обратите внимание, что этот подход является более предвзятым и менее эффективны, чем nextInt подхода, https://stackoverflow.com/a/738651/360211
Один стандартный шаблон для достижения этих целей являются:
В Ява математические функции библиотеки по математике.случайный() генерирует значение типа double в диапазоне
[0,1)
. Обратите внимание этот диапазон не включает в себя 1.Для того чтобы получить определенный диапазон значений, во-первых, нужно умножить на величину диапазона значений, которые вы хотите покрыты.
Это возвращает значение в диапазоне `[0,макс-мин), где 'макс-мин' не входит.
Например, если вы хотите[5,10), необходимо, чтобы покрыть пять целочисленных значений, так что вы использовать
Это будет возвращать значение в диапазоне `[0,5), где 5 не входит.
Теперь нужно сдвинуть этот диапазон до диапазона, который вы ориентируетесь. Вы можете сделать это путем добавления минимальное значение.
Теперь вы получите значения в диапазон[мин,макс)
. Следуя нашему примеру, это означает, что
[5,10)`:Но, это еще не'т включать "Макс", и вы получаете двойное значение. Для того, чтобы получить значение
Max
в комплекте, вам необходимо добавить 1 параметр диапазон(макс - мин) и затем усечение дробной части на кастинг к int. Это достигается через:И там Вы имеете его. Случайное целочисленное значение в диапазоне
[мин,макс]
или например[5,10]
:Использование:
Целое число
X
- это теперь случайных чисел, который имеет возможный исход5-10
.Используйте:
С [тегов:на Java 8] они ввели метод
ИНЦ(инт randomNumberOrigin, randomNumberBound инт)
вслучайных
класс.Например, если вы хотите создать пять случайных чисел (или один) в диапазоне [0, 10], Просто сделай:
Первый параметр указывает только размер
IntStream
автоматически (что есть перегруженный метод, который производит неограниченноеIntStream
).Если вам нужно сделать несколько отдельных вызовов, вы можете создавать бесконечное примитивное итератор из потока:
Вы также можете сделать это для
двойной
идлинные
значения.Надеюсь, что это помогает! :)
Вы можете редактировать ваш второй пример кода:
Просто небольшая модификация вашего первого решения будет достаточно.
Подробнее здесь для осуществления
случайных
По Математике.Класс random в Ява на основе 0. Итак, если вы пишете что-то вроде этого:
"х" будет находиться между
0-9
включительно.Таким образом, учитывая, следующий массив из 25 элементов, код для генерации случайных чисел в диапазоне от
0
(на основе массива) и `массива.длина будет:Начиная с меня.длина
вернется
25, в
nextInt( я.длина )возвращает число в диапазоне от 0-24
. Другой вариант идет с Математика.Случайный`, которая работает таким же образом.Для лучшего понимания, проверить сообщение на форуме случайные промежутки времени (archive.org).
ThreadLocalRandom эквивалент класса java.утиль.Случайные для многопоточной среды. Генерация случайных чисел осуществляется локально в каждом из потоков. Итак, мы имеем лучшую производительность за счет уменьшения конфликтов.
Х,Y - интервалы, например (1,10)
Прости меня за то, привередливых, но решение, предложенное большинством, т. е.
мин + ГСЧ.nextInt(макс - мин + 1))
, кажется опасной из-за того, что:ГСЧ.целое число nextInt(N) в не досягаемости.Массив
.Верным решением будет возвращать правильные результаты для любых мин <= МАКС
в [
целое.MIN_VALUE,
целое число.Массив`]. Рассмотрим следующий наивная реализация:Хотя и неэффективно, отмечают, что вероятность успеха в
а
петля всегда будет 50% или выше.Это может быть сделано, просто делаем заявление:
Ява Рандомизатор.генерировать(0,10); //мин ноль, максимум десяти
Ниже приводится ее исходный код
Randomizer.java
Ява открытый класс рандомизатор { публичный статический тип int генерировать(инт мин,инт Макс) { возврат мин + (инт)(математика.случайный() * ((макс - мин) + 1)); } }
Это просто чистый и простой.
Интересно, если какой-либо из случайных чисел, генерация методов, предоставляемых [Апач Викискладе математика] библиотекаматематика будет соответствовать всем требованиям.
Например:
RandomDataGenerator.nextInt
илиRandomDataGenerator.nextLong
Давайте брать пример.
Предположим, я хочу, чтобы генерировать число между 5-10:
Давайте понять это...
и ГТ; > инициализация максимум с высшей ценностью и мин с самой низкой стоимостью.
и ГТ; > Поэтому, граф, это будет макс - мин + 1.
и ГТ; > отсюда и получаем нужный диапазон.
Сгенерировать случайное число, для разница min и Max с помощью nextint(Н) метод, а затем добавить минимальное число к результату:
Джошуа Блох. Эффективная Java. Третье Издание.
Начиная с Java 8
Для вилки присоединиться бассейны и параллельных потоков, использовать SplittableRandom которое, как правило, быстрее, лучше, статистическая независимость и равномерность свойств по сравнению с
случайный
.Для генерации случайных
инт
в серии[0, 1_000]:
Для генерации случайного типа
int[100]
массив значений в диапазон[0, 1_000]:`Чтобы вернуть поток случайных значений:
Этот метод может быть удобен в использовании:
Этот метод будет возвращать случайное число между приведенные минимальное и максимальное значение:
и этот метод будет возвращать случайное число от указана минимальное и максимальное значения (так что сгенерированное число также может быть минимальное или максимальное количество):
В случае прокатки кости это будет случайное число от 1 до 6 (от 0 до 6), так:
Или взгляните на RandomUtils от Апач Викискладе.
Здесь'ы полезный класс для генерации случайных `целых чисел в диапазоне с любой комбинацией инклюзивную/эксклюзивную границы: