Генерация случайных чисел в Java в заданном диапазоне: туториал

Онлайн-тренажер Python для начинающих

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

Начать курс

Случайные числа в Java: от хаоса к порядку

Привет, будущий джавист! Если ты когда-нибудь писал игры, симуляции, тесты или просто хотел добавить элемент неожиданности в свою программу, то наверняка сталкивался с необходимостью получить случайное целое число в заданном диапазоне. Казалось бы, что может быть проще? Но на практике у новичков часто возникает вопрос: «Почему я получаю числа от 0 до 100, а не от 50 до 100?» или «Почему мой код выдает ошибку?».

Сегодня мы разберем эту тему раз и навсегда. Ты узнаешь как сгенерировать случайное число в Java в любом диапазоне, используя три основных подхода. Спойлер: один из них — лучший выбор для 90% случаев. Поехали!

Почему это важно?

Генерация случайных чисел — базовая, но критически важная задача. Без нее не обойтись при:

  • Создании тестовых данных (например, ID пользователей).
  • Реализации игровой механики (выпадение предметов, генерация уровней).
  • Моделировании случайных процессов (очереди, трафик).
  • Выборе случайного элемента из списка.

Освоив эту тему, ты перестанешь бояться «магии» в коде и сможешь уверенно управлять случайностью.

Способ №1: Классика — java.util.Random

Это дедушка всех генераторов в Java. Класс java.util.Random существует с самых ранних версий и до сих пор активно используется. Его главное преимущество — универсальность.

Как получить случайный int от 0 до N?

Метод nextInt(int bound) возвращает случайное число от 0 (включительно) до bound (исключительно). То есть если вы напишете nextInt(10), то получите число от 0 до 9.

import java.util.Random;

public class RandomExample {
    public static void main(String[] args) {
        Random random = new Random();
        int number = random.nextInt(10); // 0..9
        System.out.println("Случайное число: " + number);
    }
}

А как сделать от 5 до 15?

Вот тут и кроется главный секрет. Чтобы получить число в произвольном диапазоне [min, max], нужно использовать формулу:

min + random.nextInt(max - min + 1)

Разберем на примере: диапазон от 5 до 15.

  • max - min + 1 = 15 - 5 + 1 = 11. Значит nextInt(11) даст числа от 0 до 10.
  • Прибавляем min (5): получаем диапазон 5..15.

Проверяем: если nextInt(11) вернул 0, то 0+5 = 5. Если вернул 10, то 10+5 = 15. Идеально!

Random random = new Random();
int min = 5;
int max = 15;
int randomNumber = min + random.nextInt(max - min + 1);
System.out.println("Случайное число от 5 до 15: " + randomNumber);

Важно: Не забывай про +1! Без него максимальное значение будет на 1 меньше.

Способ №2: Современный подход — ThreadLocalRandom

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

Использование в однопоточном коде

У него есть удобный метод nextInt(int origin, int bound), который сразу принимает границы диапазона! Обрати внимание: origin — включительно, bound — исключительно. Если тебе нужно включить и верхнюю границу, просто добавь +1.

import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalRandomExample {
    public static void main(String[] args) {
        // Число от 5 до 15 (включительно)
        int randomNumber = ThreadLocalRandom.current().nextInt(5, 16);
        System.out.println("Случайное число: " + randomNumber);
    }
}

Видишь, как просто? Никаких формул, никаких new Random(). Просто вызвал current() и получил готовый генератор.

Когда использовать ThreadLocalRandom?

  • Когда нужна максимальная производительность.
  • В веб-приложениях, где каждый запрос обрабатывается в отдельном потоке.
  • Когда лень писать формулу min + nextInt(max-min+1).

Способ №3: Быстрый и грязный — Math.random()

Многие новички сначала находят Math.random(). Этот метод возвращает double от 0.0 (включительно) до 1.0 (исключительно). Чтобы получить целое число, нужно его преобразовать.

Формула для Math.random()

int randomNumber = (int)(Math.random() * (max - min + 1)) + min;

Пример для диапазона 5..15:

int min = 5;
int max = 15;
int randomNumber = (int)(Math.random() * (max - min + 1)) + min;
System.out.println("Случайное число: " + randomNumber);

Как это работает:

  • Math.random() дает число от 0.0 до 0.999...
  • Умножаем на 11 (ширина диапазона) → получаем от 0.0 до 10.999...
  • Приводим к int (отбрасываем дробную часть) → получаем 0..10.
  • Прибавляем 5 → получаем 5..15.

Минусы: Этот способ медленнее, чем Random и ThreadLocalRandom, из-за преобразования типов. Используй его только для простых скриптов или когда нет другого выбора.

Сравнение методов: что выбрать?

Давай подведем итог в виде таблицы (мысленной).

  • java.util.Random — классика. Подходит для большинства случаев. Нужен, если ты хочешь использовать один и тот же генератор много раз (например, для воспроизводимых результатов с seed).
  • ThreadLocalRandom — современный стандарт. Лучший выбор для многопоточных приложений и просто для повседневного использования. Код получается чище.
  • Math.random() — простой, но медленный. Используй только для быстрых экспериментов.

Типичные ошибки новичков

Ошибка 1: Забываю про +1

Блоги

Рекомендаций по книгам