Как сделать рандомное число в java
Как создать случайное значение int в определенном диапазоне?
Я пробовал следующее, но это не работает:
Попытка 1:
Попытка 2:
ОТВЕТЫ
Ответ 1
В Java 1.7 или более поздней версии стандартный способ сделать это выглядит следующим образом:
См. Соответствующий JavaDoc. Преимущество такого подхода состоит в том, что не нужно явно инициализировать экземпляр java.util.Random, который может быть источником путаницы и ошибки при неправильном использовании.
Однако, наоборот, нет возможности явно установить семя, поэтому может быть трудно воспроизвести результаты в ситуациях, когда это полезно, например, при тестировании или сохранении игровых состояний или аналогичных. В таких ситуациях может использоваться метод pre-Java 1.7, показанный ниже.
До Java 1.7 стандартный способ сделать это выглядит следующим образом:
В частности, нет необходимости повторно изобретать колесо генерации случайных целых чисел, когда для выполнения задачи имеется простой API в стандартной библиотеке.
Ответ 2
Один стандартный шаблон для этого:
Функция библиотеки 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] :
Ответ 3
Целое число x теперь является случайным числом, которое имеет возможный результат 5-10 .
Ответ 4
Ответ 5
Например, если вы хотите сгенерировать пять случайных целых (или одно) в диапазоне [0, 10], просто выполните:
Первый параметр указывает только размер сгенерированного IntStream (который является перегруженным методом того, который производит неограниченный IntStream ).
Если вам нужно сделать несколько отдельных вызовов, вы можете создать бесконечный примитивный итератор из потока:
Вы также можете сделать это для double и long значений.
Ответ 6
Вы можете отредактировать свой второй пример кода, чтобы:
Ответ 7
Достаточно небольшой модификации вашего первого решения.
Смотрите больше здесь для реализации Random
Ответ 8
Класс Math.Random в Java основан на 0. Итак, если вы напишите что-то вроде этого:
x будет между 0-9 включительно.
Итак, учитывая следующий массив элементов 25 , код для генерации случайного числа между 0 (основание массива) и array.length будет:
Поскольку i.length вернет 25 , nextInt( i.length ) вернет число в диапазоне 0-24 . Другой вариант работает с Math.Random , который работает таким же образом.
Ответ 9
ThreadLocalRandom эквивалент класса java.util.Random для многопоточной среды. Генерация случайного числа выполняется локально в каждом из потоков. Таким образом, мы имеем лучшую производительность за счет сокращения конфликтов.
x, y - интервалы, например. (1,10)
Ответ 10
Простите меня за брезгливость, но решение, предложенное большинством, т. min + rng.nextInt(max - min + 1)) , кажется опасным из-за того, что:
- rng.nextInt(n) не может достигнуть Integer.MAX_VALUE .
- (max - min) может привести к переполнению, когда min отрицательный.
Убедительное решение вернет правильные результаты для любого min внутри [ Integer.MIN_VALUE , Integer.MAX_VALUE ]. Рассмотрим следующую наивную реализацию:
Хотя неэффективна, что вероятность успеха в while петля всегда будет 50% или выше.
Ответ 11
Это можно сделать, просто выполнив утверждение:
Ниже его исходный код
Randomizer.java
Это просто чисто и просто.
Ответ 12
Интересно, подходит ли какой-либо метод генерации случайных чисел, предоставленный библиотекой Apache Commons Math, для счета.
Ответ 13
Предположим, что я хочу сгенерировать число между 5-10:
Давайте поймем это.
Инициализируйте max с наивысшим значением и min с самым низким значением.
Теперь нам нужно определить, сколько возможных значений можно получить. Для этого примера это будет:
5, 6, 7, 8, 9, 10
Таким образом, это будет max - min + 1.
Случайное число будет генерировать число от 0 до 5.
Добавление значения min к случайному числу приведет к:
Следовательно, мы получаем желаемый диапазон.
Ответ 14
Ответ 15
Сгенерируйте случайное число для разницы min и max с помощью метода nextint (n), а затем добавьте минимальное число к результату:
Ответ 16
Начиная с Java 7, вы больше не должны использовать Random . Для большинства случаев ThreadLocalRandom генератором случайных чисел является ThreadLocalRandom .
Для пулов объединения вилок и параллельных потоков используйте SplittableRandom .
Джошуа Блох. Эффективная Java. Третье издание.
Начиная с Java 8
Для пулов объединений и параллельных потоков используйте SplittableRandom который обычно быстрее, обладает лучшими свойствами статистической независимости и однородности по сравнению со Random .
Чтобы сгенерировать случайный [0, 1_000]: int в диапазоне [0, 1_000]:
Чтобы сгенерировать случайный массив значений int[100] в диапазоне [0, 1_000]:
Чтобы вернуть поток случайных значений:
Ответ 17
Эти методы могут быть удобны в использовании:
Этот метод возвращает случайное число между предоставленным минимальным и максимальным значением:
и этот метод вернет случайное число из предоставленного минимального и максимального значений (поэтому сгенерированное число также может быть минимальным или максимальным числом):
Ответ 18
Или взгляните на RandomUtils от Apache Commons.
Ответ 19
В случае прокатки кости это будет случайное число от 1 до 6 (не от 0 до 6), поэтому:
Ответ 20
Здесь полезный класс для генерации случайных ints в диапазоне с любой комбинацией включительно/исключительных границ:
Ответ 21
Чтобы сгенерировать случайное число "между двумя числами", используйте следующий код:
Это дает вам случайное число в диапазоне от 1 (включительно) до 11 (исключение), поэтому инициализируйте значение upperBound, добавив 1. Например, если вы хотите сгенерировать случайное число от 1 до 10, инициализируйте число upperBound с 11 вместо 10.
Ответ 22
В этом примере генерируются случайные целые числа в определенном диапазоне.
Пример запуска этого класса:
Ответ 23
Просто используйте класс Random:
Ответ 24
Вы можете добиться этого на Java 8:
Ответ 25
Когда вам нужно много случайных чисел, я не рекомендую класс Random в API. У этого есть только слишком маленький период. Вместо этого попробуйте Mersenne twister. Существует реализация Java.
Ответ 26
Ответ 27
Другой вариант - просто использовать Apache Commons:
Ответ 28
Вот простой пример, который показывает, как генерировать случайное число из замкнутого диапазона [min, max] , а min
Для генерации целого случайного числа в заданном диапазоне от Min до Max, обычно используется следующий паттерн:
Min + (int)(Math.random() * ((Max - Min) + 1))
В Java метод Math.random() генерирует число типа double в диапазоне [0,1). Обратите внимание, что 1 не входит в этот диапазон!
Чтобы получить определенный диапазон значений, сначала нужно умножить на разницу между максимумом и минимумом
Math.random() * ( Max - Min )
Это вернет нам значение в диапазоне [0,Max-Min).
К примеру, если мы хотим получить целые значения [5,10], нам нужно покрыть диапазон в 5 целых(int) значений. То есть:
Данный пример будет генерировать значения в диапазоне [0,5).
Теперь нам нужно сдвинуть этот диапазон, чтобы минимальное значение соответствовало желаемому. Для этого мы просто добавляем значение минимума
Min + (Math.random() * (Max - Min))
Теперь мы получим значение в диапазоне [Min,Max). Продолжая наш пример, это будет [5,10):
5 + (Math.random() * (10 - 5))
Но этот вариант все равно не включает значение Max, и вообще, мы получаем значение типа double. Для того чтобы значение Max тоже входило в допустимый диапазон, нужно прибавить 1 к нашему параметру диапазона (Max - Min) и затем избавиться от дробной части приведением значения к int. Вот так:
Min + (int)(Math.random() * ((Max - Min) + 1))
Теперь то что надо! Случайное целое значение в диапазоне [Min,Max], или как в нашем случае [5,10]:
int rnd = 5 + (int)(Math.random() * ((10 - 5) + 1))
Обратите внимание! Как уже не раз (а два) отмечалось в комментариях, при приведении double к int происходит не математическое округление, а просто отсекается дробная часть:
double a = 2.3;
double b = 2.8;
int i_a = (int) a; // i_a=2
int i_b = (int) b; // i_b=2
Это первая статья из серии "Азы программирования на Java". Следующие статьи:
Случайное число может быть сгенерировано двумя способами. Класс java.util.Random используется для генерации случайных чисел различных типов данных, таких как логические, int, long, float и double. Объект класса Random инициализируется, а метод nextInt (), nextDouble () или nextLong () используется для генерации случайного числа. Вы также можете использовать Math.Random для генерации случайного значения от 0,0 до 1,0.
Давайте посмотрим на них один за другим —
Пример: использование случайного класса Java
Сначала мы увидим реализацию, использующую java.util.Random. Предположим, нам нужно сгенерировать 10 случайных чисел от 0 до 100.
Вывод:
Объект класса Random инициализируется как objGenerator. У класса Random есть метод nextInt. Это обеспечит случайное число, основанное на аргументе, указанном как верхний предел, тогда как нижний предел равен 0. Таким образом, мы получаем 10 случайных чисел.
При разработке приложений часто нужно генерировать случайные числа. Java предоставляет для этого классы java.lang.Math и java.util.Random . В этой статье я расскажу о нескольких способах генерации случайных чисел и приведу конкретные примеры реализации.
Генерация случайных чисел с помощью класса Math
Для генерации случайных чисел Java предоставляет класс Math, доступный в пакете java.util. Этот класс содержит статичный метод Math.random(), предназначенный для генерации случайных чисел типа double .
Метод random( ) возвращает положительное число большее или равное 0,0 и меньшее 1,0. При вызове данного метода создается объект генератора псевдослучайных чисел java.util.Random.
Math.random() можно использовать с параметрами и без. В параметрах задается диапазон чисел, в пределах которого будут генерироваться случайные значения.
Пример использования Math.random():
Метод getRandomNumber( ) использует Math.random() для возврата положительного числа, которое больше или равно 0,0 или меньше 1,0 .
Результат выполнения кода:
Случайные числа в заданном диапазоне
Для генерации случайных чисел в заданном диапазоне необходимо указать диапазон. Синтаксис:
Разобьем это выражение на части:
- Сначала умножаем диапазон значений на результат, который генерирует метод random().Math.random() * (max — min)возвращает значение в диапазоне [0 , max- min], где max не входит в заданные рамки. Например, выражение Math.random()*5 вернет значение в диапазоне [0 , 5], в который 5 не входит.
- Расширяем охват до нужного диапазона. Это делается с помощью минимального значения.
Но выражение по-прежнему не охватывает максимальное значение.
- Чтобы получить максимальное значение, прибавьте 1 к параметру диапазона (max — min). Это вернет случайное число в указанном диапазоне.
Существуют различные способы реализации приведенного выше выражения. Рассмотрим некоторые из них.
Случайное двойное число в заданном диапазоне
По умолчанию метод Math.random() при каждом вызове возвращает случайное число типа double . Например:
Вы можете вызвать предыдущий метод из метода main, передав аргументы, подобные этому.
Случайное целое число в заданном диапазоне
Пример генерации случайного целочисленного значения в указанном диапазоне:
Метод getRandomIntegerBetweenRange() создает случайное целое число в указанном диапазоне. Так как Math.random() генерирует случайные числа с плавающей запятой, то нужно привести полученное значение к типу int. Этот метод можно вызвать из метода main, передав ему аргументы следующим образом:
Примечание . В аргументах также можно передать диапазон отрицательных значений, чтобы сгенерировать случайное отрицательное число в этом диапазоне.
Генерация случайных чисел с помощью класса Random
Класс java.util.Random можно применять для генерации случайных чисел различных типов: int, float, double, long и boolean .
Для этого сначала создайте экземпляр класса Random, а затем вызовите один из методов генератора случайных значений: nextInt( ), nextDouble( ) или nextLong( ).
Метод nextInt( ) класса Random принимает граничное целое число и возвращает случайное значение int от 0 (включительно) до указанного предела (не включая).
Пример использования метода nextInt( ):
Пример использования метода nextInt ( ) для генерации целого числа в заданном диапазоне:
Методы nextFloat ( ) и nextDouble( ) позволяют генерировать числа с плавающей запятой, а также значения типа double в диапазоне от 0,0 до 1,0.
Код для использования обоих методов:
Особенности генерации случайных чисел в Java 8
В Java 8 был представлен новый метод класса java.util.Random — ints(). Он возвращает неограниченный поток псевдослучайных значений int. Данный метод позволяет указать диапазон чисел, задав минимальное и максимальное значения.
Пример использования метода Random.ints() для генерации случайных целочисленных значений в указанном диапазоне:
Метод getRandomNumberInts( ) генерирует поток случайных целых чисел от min(включительно) и до max (не входит в диапазон).
Метод ints( ) создает IntStream, поэтому будет вызвана функция findFirst( ). Она возвращает объект OptionalInt , который описывает первый элемент этого потока. Затем код вызывает метод getAsInt( ), чтобы вернуть значение int в OptionalInt.
Пример использования метода Random.ints() для генерации потока случайных целочисленных значений:
Код для вызова предыдущего метода:
Результат работы приведенного выше кода:
Пример использования метода Random.ints() для генерации потока из диапазона случайных целочисленных значений:
Код для вызова приведенного выше метода:
Результат работы предыдущего примера:
Кроме ints( ) существует еще несколько методов, которые были добавлены к классу Random в Java 8. Они могут возвращать последовательный поток случайных чисел. Это:
- LongStream longs( );
- DoubleStream doubles( ).
Заключение
Класс java.util.Random реализует линейный конгруэнтный генератор (LCG). Он отличается быстротой работы. Но при этом он не подходит для использования в режиме реального времени. Например, для генерации уникального идентификатора сессии на сервере, в научных экспериментах, криптографии лотереях и розыгрышах.
Содержание
Описание
Метод Math.random() — в Java используется для генерации случайного числа в диапазоне от 0.0 до 1.0. Различные диапазоны могут быть достигнуты с помощью арифметики.
Синтаксис
Параметры
Подробная информация о параметрах:
Генерация случайных чисел в Java — важная и нужная тема. Действительно, она Вам понадобится неисчислимое количество раз.
Читайте также: