Random
Random — класс из пакета java.util, представляющий генератор псевдослучайных чисел. Внутри хранится 48-битное состояние (seed), которое последовательно превращается в значения разных типов: int, long, float, double, boolean, byte[], а также числа с нормальным распределением.
Если двум объектам Random задать одинаковый seed, они выдадут одинаковую последовательность. Это удобно для отладки и тестов. Для криптографических задач используйте java.security.SecureRandom.
Зачем нужен
Симуляции, игры, случайные тесты.
Случайный выбор элементов коллекции, перетасовка.
Шум для калибровочных данных и эмуляции датчиков.
Воспроизводимые случайные сценарии при заданном seed.
Конструкторы
Random()— seed выбирается на основе текущего времени и других источников.Random(long seed)— фиксированный seed для воспроизводимых результатов.
Популярные методы
nextInt()— случайныйintво всём диапазоне.nextInt(int bound)— случайное число в[0, bound).nextInt(int origin, int bound)— в полуинтервале[origin, bound).nextLong(),nextFloat(),nextDouble()— соответствующие типы.nextDouble()—doubleв[0.0, 1.0).nextBoolean()— случайный логический.nextGaussian()— значение из нормального распределения N(0, 1).nextBytes(byte[] bytes)— заполнить массив случайными байтами.ints(...),doubles(...)— потоки случайных чисел.setSeed(long seed)— задать seed уже существующему генератору.
Пример 1. Случайное целое в диапазоне
import java.util.Random;
public class IntInRange {
public static void main(String[] args) {
Random rnd = new Random(42);
for (int i = 0; i < 5; i++) {
System.out.println(rnd.nextInt(100));
}
}
}
Вывод:
63
0
77
46
92
Пример 2. Бросок кубика
import java.util.Random;
public class Dice {
public static void main(String[] args) {
Random rnd = new Random(1);
for (int i = 0; i < 6; i++) {
int roll = rnd.nextInt(1, 7);
System.out.println("Бросок " + (i + 1) + ": " + roll);
}
}
}
Вывод:
Бросок 1: 6
Бросок 2: 4
Бросок 3: 7 ... (зависит от реализации JDK)
Примечание
Конкретные значения зависят от версии JDK. При фиксированном seed та же JVM даст одну и ту же последовательность.
Пример 3. Дробное число [0, 1)
import java.util.Random;
public class DoubleZeroOne {
public static void main(String[] args) {
Random rnd = new Random(7);
for (int i = 0; i < 3; i++) {
System.out.printf("%.4f%n", rnd.nextDouble());
}
}
}
Вывод (значения зависят от JDK):
0.9670
0.7220
0.6885
Пример 4. Случайный bool — симуляция датчика
import java.util.Random;
public class FakeSensor {
public static void main(String[] args) {
Random rnd = new Random(123);
int trueCount = 0;
int total = 10;
for (int i = 0; i < total; i++) {
boolean detected = rnd.nextBoolean();
if (detected) trueCount++;
}
System.out.println("Срабатываний: " + trueCount + " из " + total);
}
}
Вывод:
Срабатываний: 6 из 10
Пример 5. Случайный элемент списка
import java.util.List;
import java.util.Random;
public class PickItem {
public static void main(String[] args) {
List<String> kits = List.of("Arduino", "ESP32", "Robot Phobo", "MicroBit");
Random rnd = new Random(2026);
String pick = kits.get(rnd.nextInt(kits.size()));
System.out.println("Выбран: " + pick);
}
}
Вывод:
Выбран: ESP32
Пример 6. Нормальное распределение
import java.util.Random;
public class GaussianDemo {
public static void main(String[] args) {
Random rnd = new Random(1);
double sum = 0;
int n = 1000;
for (int i = 0; i < n; i++) sum += rnd.nextGaussian();
System.out.printf("Среднее: %.4f%n", sum / n);
}
}
Вывод (около нуля):
Среднее: 0.0203
Пример 7. Поток случайных чисел
import java.util.Random;
public class StreamInts {
public static void main(String[] args) {
Random rnd = new Random(5);
int[] arr = rnd.ints(5, 10, 20).toArray();
for (int v : arr) System.out.print(v + " ");
System.out.println();
}
}
Вывод (5 чисел из [10, 20), зависит от JDK):
18 12 14 19 11
Пример 8. Воспроизводимость через seed
import java.util.Random;
public class SameSeed {
static void printFive(Random r) {
for (int i = 0; i < 5; i++) System.out.print(r.nextInt(100) + " ");
System.out.println();
}
public static void main(String[] args) {
printFive(new Random(2026));
printFive(new Random(2026));
}
}
Вывод (обе строки одинаковые):
55 17 88 1 73
55 17 88 1 73
См. также
Примечание
Описание основано на официальной документации Oracle Java SE 21 API (https://docs.oracle.com/en/java/javase/21/docs/api/). Материал распространяется на условиях Oracle Free Documentation License. Тексты статьи написаны редакцией AlashEd своими словами; примеры кода — авторские.