Генератор случайных чисел на Java

Узнайте, как генерировать случайные числа в Java с интерактивными примерами кода. Изучите Random.nextInt(), SecureRandom, ThreadLocalRandom и Math.random() с подробными объяснениями.

Редактор кода Java

Узнайте, как генерировать случайные числа в Java с интерактивными примерами кода. Изучите Random.nextInt(), SecureRandom, ThreadLocalRandom и Math.random() с подробными объяснениями.

import java.util.Random;

public class RandomExample {
    public static void main(String[] args) {
        Random rand = new Random();
        int min = 1;
        int max = 100;
        int quantity = 5;

        System.out.println("Random numbers between " + min + " and " + max + ":");
        for (int i = 0; i < quantity; i++) {
            int num = rand.nextInt(max - min + 1) + min;
            System.out.print(num + " ");
        }
    }
}

Вывод

Это предпросмотр в браузере, не выполнение Java или C++. Значения не подходят для криптографии.

Предпросмотр примера

Базовый Random с java.util.Random

Используйте Random.nextInt() для генерации случайных целых чисел в заданном диапазоне. Это наиболее распространённый метод для генерации случайных чисел общего назначения в Java.

Нужно быстрое случайное число?

Попробуйте наш онлайн-генератор случайных чисел для мгновенных результатов без написания кода.

Открыть генератор случайных чисел

Понимание генерации случайных чисел в Java

Java предоставляет несколько способов генерации случайных чисел, каждый оптимизирован для разных случаев. java.util.Random использует алгоритм линейного конгруэнтного генератора (LCG), SecureRandom предоставляет криптографически стойкие случайные числа, ThreadLocalRandom обеспечивает потокобезопасную генерацию для параллельных приложений, а Math.random() предоставляет простой способ генерации случайных чисел double.

java.util.Random

java.util.Random обеспечивает быструю генерацию псевдослучайных чисел, подходящую для симуляций, игр и общих задач программирования. Потокобезопасный для базового использования.

SecureRandom

java.security.SecureRandom использует платформенно-зависимые алгоритмы (SHA1PRNG, NativePRNG) для генерации криптографически защищённых случайных чисел для приложений безопасности.

ThreadLocalRandom

ThreadLocalRandom обеспечивает эффективную потокобезопасную генерацию случайных чисел, специально разработанную для многопоточных приложений, избегая конкуренции и накладных расходов синхронизации.

Math.random()

Math.random() — простой метод, возвращающий значение double от 0.0 до 1.0. Удобен для быстрых вычислений, но менее гибок, чем другие варианты.

Распространённые примеры использования

Игры и симуляции

Генерация случайных бросков кубиков, вытягивания карт, появления врагов и игровых событий с помощью Random.nextInt() или ThreadLocalRandom в игровых циклах.

Безопасность и криптография

Создание безопасных паролей, API-ключей, сеансовых токенов и криптографических солей с помощью SecureRandom для криптографически стойкой случайности.

Параллельные приложения

Используйте ThreadLocalRandom в параллельных потоках и многопоточных приложениях для избежания конкуренции и повышения производительности.

Тестирование ПО

Создание рандомизированных тестовых данных, входных данных для фаззинга и граничных случаев для обеспечения надёжного покрытия кода и обнаружения ошибок в Java-приложениях.

Как работает генерация случайных чисел в Java

Класс java.util.Random Java использует алгоритм линейного конгруэнтного генератора (LCG) с 48-битным начальным значением. Он предоставляет простой способ генерации псевдослучайных чисел и синхронизирован для потокобезопасности.

Класс SecureRandom предоставляет криптографически стойкие случайные числа, используя платформенно-зависимые реализации. На большинстве систем он использует источник энтропии операционной системы или аппаратные генераторы случайных чисел.

ThreadLocalRandom, представленный в Java 7, разработан для многопоточных приложений. Он использует генератор случайных чисел, изолированный для текущего потока, избегая накладных расходов на синхронизацию и конкуренцию.

Практические советы

🎯

Выберите правильный API

Используйте Random для простых случаев, SecureRandom для безопасности, ThreadLocalRandom для параллельных приложений и Math.random() только для быстрых прототипов. Каждый имеет свои случаи применения.

🔒

Всегда используйте SecureRandom для безопасности

Никогда не используйте Random или Math.random() для паролей, токенов или криптографических операций. Всегда используйте SecureRandom для обеспечения стойкой случайности и избегания предсказуемых паттернов.

⚡

Оптимизация для параллельного доступа

В многопоточных приложениях ThreadLocalRandom значительно быстрее синхронизации объектов Random. Используйте его в параллельных потоках и параллельных коллекциях.

Технические характеристики

Алгоритмы

  • Линейный конгруэнтный генератор (класс Random)
  • SHA1PRNG или NativePRNG (SecureRandom)
  • ThreadLocalRandom (Java 7+, на основе Random)
  • Псевдослучайное double (Math.random())

Характеристики производительности

  • Math.random(): Быстрейший для простых double
  • ThreadLocalRandom: Лучший для параллельного доступа
  • Random: Хороший для общего назначения, накладные расходы на синхронизацию
  • SecureRandom: Медленнее из-за сбора энтропии

Часто задаваемые вопросы

Какие API Java охвачены?

java.util.Random, SecureRandom, ThreadLocalRandom и Math.random(), каждый из которых содержит конкретный пример.

Могу ли я адаптировать примеры?

Да. Установите минимум, максимум и количество на панели параметров и запустите, чтобы мгновенно увидеть результаты.

Какой из них мне следует использовать для безопасности?

SecureRandom. Другие API предсказуемы и не должны поддерживать токены, ключи или пароли.

А как насчет многопоточного кода?

ThreadLocalRandom позволяет избежать конфликтов между потоками и является обычным выбором внутри параллельных потоков и пулов потоков.

Как сгенерировать случайное число между двумя значениями в Java?

Вызовите nextInt(bound), чтобы получить значения от 0 до bound-1, поэтому nextInt(50) выдаёт числа от 0 до 49. Для произвольного диапазона добавьте смещение: nextInt(10) + 5 даёт числа от 5 до 14. Начиная с Java 17, nextInt(origin, bound) выполняет это одним вызовом, где origin включается в диапазон, а bound — исключается.

Может ли Math.random() вернуть 1?

Нет. Math.random() возвращает double от 0.0 включительно до 1.0 (не включая), поэтому могут встретиться 0.0 или 0.9999, но 1.0 — никогда. Внутри этот метод делегирует вызов единственному экземпляру java.util.Random, поэтому в современном коде понятнее вызывать методы Random напрямую.

Почему при каждом запуске программы я получаю одни и те же случайные числа?

Random, созданный с фиксированным seed, например new Random(42), всегда воспроизводит одну и ту же последовательность. Уберите аргумент seed, и инициализация произойдёт автоматически на основе уникального значения в сочетании с System.nanoTime(). Фиксированные seed удобны для воспроизводимых тестов и отладки, но в рабочем (продакшн) коде им не место.

Как выбрать случайный элемент из массива или списка?

Сгенерируйте индекс и обратитесь к этой позиции: list.get(random.nextInt(list.size())) для списков или array[random.nextInt(array.length)] для массивов, поскольку nextInt(n) охватывает значения от 0 до n-1. В качестве альтернативы Collections.shuffle() перемешивает весь порядок списка за один проход, так что ни один элемент не повторится в рамках одного перемешивания.

Источники и ресурсы