Как сделать рандом в java
Генерируем случайное число Java
Генерация случайных чисел с помощью класса Math
Метод random( ) возвращает положительное число большее или равное 0,0 и меньшее 1,0. При вызове данного метода создается объект генератора псевдослучайных чисел java.util.Random.
Math.random() можно использовать с параметрами и без. В параметрах задается диапазон чисел, в пределах которого будут генерироваться случайные значения.
Пример использования Math.random():
Результат выполнения кода:
Случайные числа в заданном диапазоне
Для генерации случайных чисел в заданном диапазоне необходимо указать диапазон. Синтаксис:
Разобьем это выражение на части:
Но выражение по-прежнему не охватывает максимальное значение.
Существуют различные способы реализации приведенного выше выражения. Рассмотрим некоторые из них.
Случайное двойное число в заданном диапазоне
Вы можете вызвать предыдущий метод из метода main, передав аргументы, подобные этому.
Случайное целое число в заданном диапазоне
Пример генерации случайного целочисленного значения в указанном диапазоне:
Метод getRandomIntegerBetweenRange() создает случайное целое число в указанном диапазоне. Так как Math.random() генерирует случайные числа с плавающей запятой, то нужно привести полученное значение к типу int. Этот метод можно вызвать из метода main, передав ему аргументы следующим образом:
Генерация случайных чисел с помощью класса Random
Для этого сначала создайте экземпляр класса 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 (не входит в диапазон).
Пример использования метода Random.ints() для генерации потока случайных целочисленных значений:
Код для вызова предыдущего метода:
Результат работы приведенного выше кода:
Пример использования метода Random.ints() для генерации потока из диапазона случайных целочисленных значений:
Код для вызова приведенного выше метода:
Результат работы предыдущего примера:
Кроме ints( ) существует еще несколько методов, которые были добавлены к классу Random в Java 8. Они могут возвращать последовательный поток случайных чисел. Это:
Заключение
Класс java.util.Random реализует линейный конгруэнтный генератор (LCG). Он отличается быстротой работы. Но при этом он не подходит для использования в режиме реального времени. Например, для генерации уникального идентификатора сессии на сервере, в научных экспериментах, криптографии лотереях и розыгрышах.
Пожалуйста, оставьте свои комментарии по текущей теме материала. Мы крайне благодарны вам за ваши комментарии, отклики, дизлайки, лайки, подписки!
Пожалуйста, оставляйте ваши отзывы по текущей теме материала. За комментарии, отклики, лайки, дизлайки, подписки огромное вам спасибо!
Генерация случайных чисел
Класс Math библиотеки Java имеет метод random(), который генерирует случайное значение в диапазоне [0,1). Обратите внимание, что данный диапазон не включает 1 и при описании закрывается круглой скобкой. Можно ли предсказать сгенерированное значение? Теоретически возможно, но практически – это очень труднореализуемая задача. А поскольку существует небольшая вероятность предсказывания случайно-сгенерируемого значения, то такие числа принято называть не случайными, а псевдослучайными.
Чтобы получить псевдо-случайное число в определенном диапазоне необходимо значение метода random() умножить на величину диапазона значений. Например, необходимо генерировать значение в диапазоне от min до max. В этом случае можно использовать следующий код :
Допустим, что необходимо получить значение в диапазоне [1,10), где min=1, max=10 (10 исключительно)
Алгоритм работает следующим образом : диапазон [0;1) умножается на 9=(10-1), соответственно получаем :
получаем диапазон [0,9), к которому добавляем min=1. В результате имеем :
После подстановки значений в выражение, получим :
Диапазон [-10, 10)
Генерирование целочисленных псевдослучайных значений
Для генерирования целочисленных псевдослучайных значений используется представленное выше выражение, в котором произведение «приводится» к целочисленному значению. Например, попробуем получить псевдослучайное значение в диапазоне [5,20]. Обратите внимание, что закрывающаяся скобка квадратная, т.е. 20 входит в диапазон. В этом случае к разности между максимальным и минимальным значениями следует добавить 1, т.е. определить диапазон целочисленных значений [5,21), где 21 не попадает в желаемый диапазон :
Класс Random
В качестве генератора псевдослучайных чисел можно также использовать класс java.util.Random, имеющий два конструктора :
Поскольку Random создаёт псевдослучайное число, то определив начальное число, устанавливается начальная точка случайной последовательности, способствующая получению одинаковых случайных последовательностей. Чтобы избежать такого совпадения, обычно применяют второй конструктор с использованием в качестве инициирующего значения текущего времени. В таблице представлены наиболее часто используемые методы генератора Random :
Метод | Описание |
---|---|
boolean nextBoolean() | получение следующего случайного значения типа boolean |
double nextDouble() | получение следующего случайного значения типа double |
float nextFloat() | получение следующего случайного значения типа float |
int nextInt() | получение следующего случайного значения типа int |
int nextInt(int n) | получение следующего случайного значения типа int в диапазоне от 0 до n |
long nextLong() | получение следующего случайного значения типа long |
void nextBytes(byte[] buf) | формирование массива из случайно генерируемых значений |
Пример получения псевдослучайного целочисленного значения с использованием класса Random :
С классом Random алгоритм получения псевдослучайного числа такой же, как и у метода random класса Math. Допустим, что нам необходимо получить случайное число в диапазоне [5,100], 100 включительно. В этом случае код может выглядеть следующим образом :
Класс SecureRandom
Для криптографии следует применять класс SecureRandom, использующий криптографически сильный генератор случайных чисел (random number generator RNG).
В следующем примере формируется массив псевдослучайных значений типа byte :
Этот же массив можно сформировать методом generateSeed :
Пример использования SecureRandom представлен на странице Симметричного шифрования.
Случайные числа в Java
1. Псевдослучайные числа
Иногда программист сталкивается с простыми, казалось бы, задачами: «отобрать случайный фильм для вечернего просмотра из определенного списка», «выбрать победителя лотереи», «перемешать список песен при тряске смартфона», «выбрать случайное число для шифрования сообщения», и каждый раз у него возникает очень закономерный вопрос: а как получить это самое случайное число?
Вообще-то, если вам нужно получить «настоящее случайное число», сделать это довольно-таки трудно. Вплоть до того, что в компьютер встраивают специальные математические сопроцессоры, которые умеют генерировать такие числа, с выполнением всех требований к «истинной случайности».
Есть много алгоритмов генерации последовательности псевдослучайных чисел и почти все из них генерируют следующее случайное число на основе предыдущего и еще каких-то вспомогательных чисел.
Например, данная программа выведет на экран 1000 неповторяющихся чисел:
Кстати, мы говорим не о псевдослучайных числах, а именно о последовательности таких чисел. Т.к. глядя на одно число невозможно понять, случайное оно или нет.
Случайное число ведь можно получить разными способами:
2. Метод Math.random()
Код | Вывод на экран |
---|
Но что, если вам этот метод не очень подходит, а вы хотите, допустим, написать программу, которая имитирует выбрасывание кубика с шестью гранями. Как получить случайные целые числа в диапазоне 1..6, а не вещественные в диапазоне 0..1?
Это на самом деле довольно просто.
Код | Вывод на экран |
---|
Класс Random
Класс java.util.Random представляет собой генератор псевдослучайных чисел.
Класс представлен двумя конструкторами
Так как класс создаёт псевдослучайное число, то задав начальное число, вы определяете начальную точку случайной последовательности. И будете получать одинаковые случайные последовательности. Чтобы избежать такого совпадения, обычно используют второй конструктор с использованием текущего времени в качестве инициирующего значения.
Пример для вывода случайного числа.
Случайные числа часто используются в играх. Допустим, мы хотим вывести случайные числа от 1 до 6 при бросании игрального кубика. Попробуем.
При проверке вы заметите две нестыковки. Во-первых, иногда выпадает число 0, которого нет на кубике, а во-вторых никогда не выпадает число 6. Когда вы помещаете число в параметр метода, то это означает, что выпадают числа в диапазоне от 0 до указанного числа, которое в этот диапазон не входит. Если вы будете использовать число 7, то шестёрка станет выпадать, но по-прежнему будет выпадать число 0. Поэтому пример следует немного отредактировать.
Для генерации 10 чисел типа int используйте код:
Генерация в определённом интервале
Нужны случайные числа от 100 до 200? Пишем код.
Случайные цвета
Работать с числами не слишком интересно. Давайте поработаем со цветом. В Android некоторые цвета имеют конкретные названия, но по сути они являются числами типа int, например, красный цвет имеет константу Color.RED. Вам не надо знать, какое число соответствует этому цвету, так как проще понять по его названию.
Щёлкая по кнопке, вы будете менять её цвет случайным образом.
Лотерея «6 из 49»
Сформируем шесть случайных чисел из 49 и занесём их в списочный массив.
SecureRandom
Стандартный класс Random обычно используют для простых задач, не связанных с шифрованием. Для криптографии следует использовать схожий класс java.security.SecureRandom.
Не забывайте, что в классе Math есть метод random(), возвращающий случайное число от 0 до 1 (единица в диапазон не входит).
Generating Random Numbers in Java
Last modified: May 21, 2021
Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:
1. Overview
In this tutorial, we’ll explore different ways of generating random numbers in Java.
2. Using Java API
The Java API provides us with several ways to achieve our purpose. Let’s see some of them.
2.1. java.lang.Math
The random method of the Math class will return a double value in a range from 0.0 (inclusive) to 1.0 (exclusive). Let’s see how we’d use it to get a random number in a given range defined by min and max:
2.2. java.util.Random
Before Java 1.7, the most popular way of generating random numbers was using nextInt. There were two ways of using this method, with and without parameters. The no-parameter invocation returns any of the int values with approximately equal probability. So, it’s very likely that we’ll get negative numbers:
If we use the netxInt invocation with the bound parameter, we’ll get numbers within a range:
This will give us a number between 0 (inclusive) and parameter (exclusive). So, the bound parameter must be greater than 0. Otherwise, we’ll get a java.lang.IllegalArgumentException.
Java 8 introduced the new ints methods that return a java.util.stream.IntStream. Let’s see how to use them.
The ints method without parameters returns an unlimited stream of int values:
We can also pass in a single parameter to limit the stream size:
And, of course, we can set the maximum and minimum for the generated range:
2.3. java.util.concurrent.ThreadLocalRandom
Java 1.7 release brought us a new and more efficient way of generating random numbers via the ThreadLocalRandom class. This one has three important differences from the Random class:
Now, let’s see how it works:
With Java 8 or above, we have new possibilities. Firstly, we have two variations for the nextInt method:
Secondly, and more importantly, we can use the ints method:
2.4. java.util.SplittableRandom
Java 8 has also brought us a really fast generator — the SplittableRandom class.
As we can see in the JavaDoc, this is a generator for use in parallel computations. It’s important to know that the instances are not thread-safe. So, we have to take care when using this class.
We have available the nextInt and ints methods. With nextInt we can set directly the top and bottom range using the two parameters invocation:
This way of using checks that the max parameter is bigger than min. Otherwise, we’ll get an IllegalArgumentException. However, it doesn’t check if we work with positive or negative numbers. So, any of the parameters can be negative. Also, we have available one- and zero-parameter invocations. Those work in the same way as we have described before.
We have available the ints methods, too. This means that we can easily get a stream of int values. To clarify, we can choose to have a limited or unlimited stream. For a limited stream, we can set the top and bottom for the number generation range:
2.5. java.security.SecureRandom
If we have security-sensitive applications, we should consider using SecureRandom. This is a cryptographically strong generator. Default-constructed instances don’t use cryptographically random seeds. So, we should either:
This class inherits from java.util.Random. So, we have available all the methods we saw above. For example, if we need to get any of the int values, then we’ll call nextInt without parameters:
On the other hand, if we need to set the range, we can call it with the bound parameter:
We must remember that this way of using it throws IllegalArgumentException if the parameter is not bigger than zero.
3. Using Third-Party APIs
As we have seen, Java provides us with a lot of classes and methods for generating random numbers. However, there are also third-party APIs for this purpose.
We’re going to take a look at some of them.
3.1. org.apache.commons.math3.random.RandomDataGenerator
There are a lot of generators in the commons mathematics library from the Apache Commons project. The easiest, and probably the most useful, is the RandomDataGenerator. It uses the Well19937c algorithm for the random generation. However, we can provide our algorithm implementation.
Let’s see how to use it. Firstly, we have to add dependency:
The latest version of commons-math3 can be found on Maven Central.
Then we can start working with it:
3.2. it.unimi.dsi.util.XoRoShiRo128PlusRandom
Certainly, this is one of the fastest random number generator implementations. It has been developed at the Information Sciences Department of the Milan University.
The library is also available at Maven Central repositories. So, let’s add the dependency:
This generator inherits from java.util.Random. However, if we take a look at the JavaDoc, we realize that there’s only one way of using it — through the nextInt method. Above all, this method is only available with the zero- and one-parameter invocations. Any of the other invocations will directly use the java.util.Random methods.
For example, if we want to get a random number within a range, we would write:
4. Conclusion
There are several ways to implement random number generation. However, there is no best way. Consequently, we should choose the one that best suits our needs.
The full example can be found over on GitHub.