Класс Random
Класс java.util.Random представляет собой генератор псевдослучайных чисел.
Класс представлен двумя конструкторами
- Random() — создаёт генератор чисел, использующий уникальное начальное число
- Random(long seed) — позволяет указать начальное число вручную
Так как класс создаёт псевдослучайное число, то задав начальное число, вы определяете начальную точку случайной последовательности. И будете получать одинаковые случайные последовательности. Чтобы избежать такого совпадения, обычно используют второй конструктор с использованием текущего времени в качестве инициирующего значения.
- boolean nextBoolean() — возвращает следующее случайное значение типа boolean
- void nextBytes(byte[] buf) — заполняет массив случайно созданными значениями
- double nextDouble() — возвращает следующее случайное значение типа double
- float nextFloat() — возвращает следующее случайное значение типа float
- synchronized double nextGaussian() — возвращает следующее случайное значение гауссова случайного числа, т.е. значения, центрированное по 0.0 со стандартным отклонением в 1.0 (кривая нормального распределения)
- int nextInt(int n) — возвращает следующее случайное значение типа int в диапазоне от 0 до n
- int nextInt() — возвращает следующее случайное значение типа int
- long nextLong() — возвращает следующее случайное значение типа long
- synchronized void setSeeD(long seed) — устанавливает начальное значение
Пример для вывода случайного числа.
final Random random = new Random(); public void onClick(View v)
Случайные числа часто используются в играх. Допустим, мы хотим вывести случайные числа от 1 до 6 при бросании игрального кубика. Попробуем.
mInfoTextView.setText(String.valueOf(random.nextInt(6)));
При проверке вы заметите две нестыковки. Во-первых, иногда выпадает число 0, которого нет на кубике, а во-вторых никогда не выпадает число 6. Когда вы помещаете число в параметр метода, то это означает, что выпадают числа в диапазоне от 0 до указанного числа, которое в этот диапазон не входит. Если вы будете использовать число 7, то шестёрка станет выпадать, но по-прежнему будет выпадать число 0. Поэтому пример следует немного отредактировать.
mInfoTextView.setText(String.valueOf(random.nextInt(6) + 1));
Для генерации 10 чисел типа int используйте код:
String result = ""; for(int i = 0; i < 10; i++)< result += String.valueOf(myRandom.nextInt()) + "\n"; >mInfoTextView.setText(result);
Генерация в определённом интервале
Нужны случайные числа от 100 до 200? Пишем код.
int min = 100; int max = 200; int diff = max - min; Random random = new Random(); int i = random.nextInt(diff + 1); i += min;
Случайные цвета
Работать с числами не слишком интересно. Давайте поработаем со цветом. В Android некоторые цвета имеют конкретные названия, но по сути они являются числами типа int, например, красный цвет имеет константу Color.RED. Вам не надо знать, какое число соответствует этому цвету, так как проще понять по его названию.
public void onClick(View view) < Random random = new Random(); // Массив из пяти цветов int colors[] = < Color.BLUE, Color.GREEN, Color.MAGENTA, Color.RED, Color.CYAN >; int pos = random.nextInt(colors.length); // Меняем цвет у кнопки mButton.setBackgroundColor(colors[pos]); >
Щёлкая по кнопке, вы будете менять её цвет случайным образом.
Лотерея «6 из 49»
Сформируем шесть случайных чисел из 49 и занесём их в списочный массив.
public void onClick(View v) < ArrayListlotteryList = getRandomNumber(); Log.i("Lottery", "" + lotteryList.get(0) + "," + lotteryList.get(1) + "," + lotteryList.get(2) + "," + lotteryList.get(3) + "," + lotteryList.get(4) + "," + lotteryList.get(5)); > private ArrayList getRandomNumber() < ArrayListnumbersGenerated = new ArrayList<>(); for (int i = 0; i < 6; i++) < Random randNumber = new Random(); int iNumber = randNumber.nextInt(48) + 1; if (!numbersGenerated.contains(iNumber)) < numbersGenerated.add(iNumber); >else < i--; >> return numbersGenerated; >
SecureRandom
Стандартный класс Random обычно используют для простых задач, не связанных с шифрованием. Для криптографии следует использовать схожий класс java.security.SecureRandom.
SecureRandom secureRandom = new SecureRandom(); mInfoTextView.setText(String.valueOf(secureRandom.nextInt(6)));
Не забывайте, что в классе Math есть метод random(), возвращающий случайное число от 0 до 1 (единица в диапазон не входит).
В Java 7 появился новый класс java.util.concurrent.ThreadLocalRandom. В Java 8 появился ещё один класс SplittableRandom.
Генерация случайных чисел
Класс Math библиотеки Java имеет метод random(), который генерирует случайное значение в диапазоне [0,1). Обратите внимание, что данный диапазон не включает 1 и при описании закрывается круглой скобкой. Можно ли предсказать сгенерированное значение? Теоретически возможно, но практически – это очень труднореализуемая задача. А поскольку существует небольшая вероятность предсказывания случайно-сгенерируемого значения, то такие числа принято называть не случайными, а псевдослучайными.
Чтобы получить псевдо-случайное число в определенном диапазоне необходимо значение метода random() умножить на величину диапазона значений. Например, необходимо генерировать значение в диапазоне от min до max. В этом случае можно использовать следующий код :
double d = Math.random() * (max - min) + min;
Допустим, что необходимо получить значение в диапазоне [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.
После подстановки значений в выражение, получим :
double d = Math.random() * (10 - 1) + 1;
Диапазон [-10, 10)
Чтобы получить псевдослучайное число в диапазоне от -10 до 10 (исключительно), необходимо значение Math.random() умножить на 20 и вычесть 10, как это представлено в следующем примере :
// после подстановки значений double d = Math.random() * (10 - (-10)) + (-10); // получаем double d = Math.random() * 20 - 10;
Генерирование целочисленных псевдослучайных значений
Для генерирования целочисленных псевдослучайных значений используется представленное выше выражение, в котором произведение «приводится» к целочисленному значению. Например, попробуем получить псевдослучайное значение в диапазоне [5,20]. Обратите внимание, что закрывающаяся скобка квадратная, т.е. 20 входит в диапазон. В этом случае к разности между максимальным и минимальным значениями следует добавить 1, т.е. определить диапазон целочисленных значений [5,21), где 21 не попадает в желаемый диапазон :
// после подстановки значений int i = (int)Math.random() * (20 - 5 + 1) + 5; // получаем int i = (int)Math.random() * 16 + 5;
Класс Random
В качестве генератора псевдослучайных чисел можно также использовать класс java.util.Random, имеющий два конструктора :
public Random(); public Random(long);
Поскольку 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 = new Random(); int i = random.nextInt();
С классом Random алгоритм получения псевдослучайного числа такой же, как и у метода random класса Math. Допустим, что нам необходимо получить случайное число в диапазоне [5,100], 100 включительно. В этом случае код может выглядеть следующим образом :
int min = 5; int max = 100; int diff = max - min; Random random = new Random(); int i = random.nextInt(diff + 1) + min;
Класс SecureRandom
Для криптографии следует применять класс SecureRandom, использующий криптографически сильный генератор случайных чисел (random number generator RNG).
В следующем примере формируется массив псевдослучайных значений типа byte :
SecureRandom random = new SecureRandom(); byte bytes[] = new byte[8]; random.nextBytes(bytes);
Этот же массив можно сформировать методом generateSeed :
byte seed[] = random.generateSeed(8);
Пример использования SecureRandom представлен на странице Симметричного шифрования.
Класс ThreadLocalRandom
В JDK 7 включен класс ThreadLocalRandom из многопоточного пакета java.util.concurrent, который следует использовать для получения псевдослучайных значений в многопоточных приложениях. Для получения экземпляра ThreadLocalRandom следует использовать статический метод current() данного класса. Пример :
ThreadLocalRandom random = ThreadLocalRandom.current(); System.out.println("Random values : "); System.out.println("boolean : " + random.nextBoolean()); System.out.println("int : " + random.nextInt ()); System.out.println("float : " + random.nextFloat ()); System.out.println("long : " + random.nextLong ()); System.out.println("int from 0 to 5 : " + random.nextInt(5)); System.out.println("long from 5 to 15 : " + random.nextLong(5, 15));
Math.random()
Статический метод Math.random() возвращает псевдослучайное число с плавающей запятой, которое больше или равно нулю и меньше единицы с приблизительно равномерным распределением в этом диапазоне. В дальнейшем это число можно «отмасштабировать», привести к нужному диапазону. Выбор начального числа для алгоритма генерации случайных чисел происходит автоматически (зависит от реализации) и не может быть изменён пользователем.
Примечание: метод Math.random() не предоставляет криптографически стойкие случайные числа. Не используйте его ни для чего, связанного с безопасностью. Для таких целей используйте Web Crypto API и более точный метод window.crypto.getRandomValues() .
Интерактивный пример
Синтаксис
.random()
Параметры
Возвращаемое значение
Псевдослучайное число с плавающей запятой от 0 (включительно) до 1 (не включая).
Примеры
Обратите внимание, что поскольку числа в JavaScript являются числами с плавающей запятой стандарта IEEE 754 с округлением к ближайшему чётному, используемые в приведённых функциях диапазоны (исключая диапазон с простым вызовом Math.random() ), не точны. Если заданы очень большие границы (2 53 или выше), возможен крайне редкий случай достижения обычно исключённой верхней границы.
Получение случайного числа от 0 (включительно) до 1 (не включая)
function getRandom() return Math.random(); >
Получение случайного числа в заданном интервале
Этот пример возвращает случайное число в заданном интервале. Возвращаемое значение не менее (и может быть равно) min и не более (и не равно) max .
function getRandomArbitrary(min, max) return Math.random() * (max - min) + min; >
Получение случайного целого числа в заданном интервале
Этот пример возвращает случайное целое число в заданном интервале. Возвращаемое значение не менее min (или следующее целое число, которое больше min , если min не целое) и не более (но не равно) max .
function getRandomInt(min, max) min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min) + min); // Максимум не включается, минимум включается >
Примечание: Может показаться заманчивым использовать Math.round() для округления, но это может сделать распределение неравномерным и оказаться не тем, что вам нужно.
Получение случайного целого числа в заданном интервале, включительно
Функция getRandomInt() выше включает минимальное значение, но не включает максимальное. Но что если вам нужно, чтобы включалось и минимальное, и максимальное значение? Функция getRandomIntInclusive() решает этот вопрос.
function getRandomIntInclusive(min, max) min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1) + min); // Максимум и минимум включаются >
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-math.random |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 11 дек. 2023 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2024 by individual mozilla.org contributors. Content available under a Creative Commons license.
Генерация случайных чисел в Java
Возникает ситуация, когда требуется генерация случайного числа в определенном диапазоне. Например, при разработке игры, где необходимо случайным образом задавать координаты объектов на игровом поле. Или в случае моделирования случайных процессов в научных расчетах.
В Java для генерации случайных чисел используется класс Math и его метод random() . Этот метод возвращает случайное число с плавающей точкой в диапазоне от 0.0 (включительно) до 1.0 (исключительно).
Однако, что делать, если требуется получить случайное число в другом диапазоне, например, от 1 до 50?
Для этого нужно использовать формулу преобразования диапазона случайного числа. Эта формула выглядит так:
minValue + Math.random() * (maxValue — minValue + 1)
Где minValue — это минимальное значение диапазона, а maxValue — максимальное.
Таким образом, если требуется получить случайное число от 1 до 50, код будет выглядеть следующим образом:
int minValue = 1; int maxValue = 50; int randomValue = minValue + (int) (Math.random() * (maxValue - minValue + 1));
В этом коде Math.random() генерирует случайное число от 0 до 1, которое затем умножается на (maxValue — minValue + 1) . Результат прибавляется к minValue , что сдвигает диапазон от 0-1 до minValue-maxValue .
Таким образом, можно получить случайное число в любом заданном диапазоне, используя Math.random() . Важно помнить, что этот метод возвращает число с плавающей точкой, поэтому для получения целого числа результат нужно привести к целому типу с помощью оператора (int) .