Класс Math библиотеки Java имеет метод random(), который генерирует случайное значение в диапазоне [0,1). Обратите внимание, что данный диапазон не включает 1 и при описании закрывается круглой скобкой. Можно ли предсказать сгенерированное значение? Теоретически возможно, но практически – это очень труднореализуемая задача. А поскольку существует небольшая вероятность предсказывания случайно-сгенерируемого значения, то такие числа принято называть не случайными, а псевдослучайными.
Чтобы получить псевдо-случайное число в определенном диапазоне необходимо значение метода random() умножить на величину диапазона значений. Например, необходимо генерировать значение в диапазоне от min до max. В этом случае можно использовать следующий код :
Допустим, что необходимо получить значение в диапазоне [1,10), где min=1, max=10 (10 исключительно)
Алгоритм работает следующим образом : диапазон [0;1) умножается на 9=(10-1), соответственно получаем :
нижняя граница: 0*9 = 0;
верхняя граница: 1*9 = 9,
получаем диапазон [0,9), к которому добавляем min=1. В результате имеем :
нижняя граница: 0 + 1 = 1;
верхняя граница: 9 + 1 = 10.
После подстановки значений в выражение, получим :
Диапазон [-10, 10)
Чтобы получить псевдослучайное число в диапазоне от -10 до 10 (исключительно), необходимо значение Math.random() умножить на 20 и вычесть 10, как это представлено в следующем примере :
Для генерирования целочисленных псевдослучайных значений используется представленное выше выражение, в котором произведение «приводится» к целочисленному значению. Например, попробуем получить псевдослучайное значение в диапазоне [5,20]. Обратите внимание, что закрывающаяся скобка квадратная, т.е. 20 входит в диапазон. В этом случае к разности между максимальным и минимальным значениями следует добавить 1, т.е. определить диапазон целочисленных значений [5,21), где 21 не попадает в желаемый диапазон :
Класс Random
В качестве генератора псевдослучайных чисел можно также использовать класс java.util.Random, имеющий два конструктора :
Поскольку Random создаёт псевдослучайное число, то определив начальное число, устанавливается начальная точка случайной последовательности, способствующая получению одинаковых случайных последовательностей. Чтобы избежать такого совпадения, обычно применяют второй конструктор с использованием в качестве инициирующего значения текущего времени. В таблице представлены наиболее часто используемые методы генератора Random :
Класс SecureRandom
Для криптографии следует применять класс SecureRandom, использующий криптографически сильный генератор случайных чисел (random number generator RNG).
В следующем примере формируется массив псевдослучайных значений типа byte :
Этот же массив можно сформировать методом generateSeed :
Пример использования SecureRandom представлен на странице Симметричного шифрования.
Содержание
Описание
Метод Math.random() — в Java используется для генерации случайного числа в диапазоне от 0.0 до 1.0. Различные диапазоны могут быть достигнуты с помощью арифметики.
Синтаксис
Параметры
Подробная информация о параметрах:
Метод по умолчанию не принимает параметр.
При разработке приложений часто нужно генерировать случайные числа. 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). Он отличается быстротой работы. Но при этом он не подходит для использования в режиме реального времени. Например, для генерации уникального идентификатора сессии на сервере, в научных экспериментах, криптографии лотереях и розыгрышах.
Данная публикация представляет собой перевод статьи « Random Number Generation in Java » , подготовленной дружной командой проекта Интернет-технологии.ру