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 своими словами; примеры кода — авторские.