Генерация случайных чисел
Random и ThreadLocalRandom
«Генерация случайных чисел» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Генерация случайных чисел
Случайность используется в играх, моделировании и выборке. Java предоставляет Math.random(), класс Random и ThreadLocalRandom для многопоточного кода.
Основы Math.random
Math.random() возвращает значение типа double в диапазоне [0.0, 1.0): ноль включается, единица — нет.
public class Main {
public static void main(String[] args) {
double r = Math.random();
System.out.println("Value between 0 and 1: " + r);
}
}Масштабирование Math.random
Чтобы получить диапазон целых чисел, умножьте результат и выполните приведение типа. Выражение (int)(Math.random() * 6) даёт значения от 0 до 5.
public class Main {
public static void main(String[] args) {
int roll = (int)(Math.random() * 6) + 1;
System.out.println("Dice: " + roll);
}
}Класс Random
Класс java.util.Random более гибок. Создайте экземпляр, а затем вызывайте такие методы, как nextInt, nextDouble и nextBoolean.
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random();
System.out.println(rng.nextBoolean());
System.out.println(rng.nextDouble());
}
}nextInt с верхней границей
nextInt(bound) возвращает int от 0 включительно до bound исключительно. Вызов nextInt(6) даёт значения от 0 до 5.
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random();
int value = rng.nextInt(100);
System.out.println("0 to 99: " + value);
}
}Начальное значение для воспроизводимости
Передача начального значения конструктору делает последовательность детерминированной: одно и то же начальное значение всегда порождает одни и те же числа. Это чрезвычайно полезно при тестировании.
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random(42);
System.out.println(rng.nextInt(1000));
System.out.println(rng.nextInt(1000));
}
}Одинаковое начальное значение — одинаковая последовательность
Два объекта Random, созданные с одинаковым начальным значением, выдают идентичные последовательности. Это полезно, когда ошибку нужно воспроизвести в точности.
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random a = new Random(7);
Random b = new Random(7);
System.out.println(a.nextInt(50) == b.nextInt(50));
}
}ThreadLocalRandom
В многопоточных программах один общий объект Random становится узким местом. ThreadLocalRandom.current() предоставляет каждому потоку собственный генератор без конкуренции за общий ресурс.
import java.util.concurrent.ThreadLocalRandom;
public class Main {
public static void main(String[] args) {
int value = ThreadLocalRandom.current().nextInt(1, 7);
System.out.println("Dice: " + value);
}
}Не используйте один Random в разных потоках
Не передавайте один экземпляр Random множеству потоков: это может привести к неравномерному распределению и конкуренции за общий ресурс. В многопоточном коде предпочтителен ThreadLocalRandom.
Вещественные числа и распределение Гаусса
nextDouble() возвращает значение из диапазона [0,1), а nextGaussian() — значение из нормального распределения со средним 0 и стандартным отклонением 1.
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random(1);
System.out.println(rng.nextDouble());
System.out.println(rng.nextGaussian());
}
}Выбор подходящего средства
Используйте Math.random() для быстрого получения числа двойной точности, Random, когда нужны границы или начальное значение, и ThreadLocalRandom в многопоточном коде. Для случайных значений, связанных с безопасностью, вместо этого используйте SecureRandom.
Быстрая проверка
Проверьте, насколько хорошо Вы поняли работу со случайностью.
Повторение
Вы научились генерировать случайные числа.
Math.random()возвращает число двойной точности из диапазона [0,1).Random.nextInt(bound)возвращает значения от 0 до bound-1.- Начальное значение делает последовательности воспроизводимыми.
ThreadLocalRandom— безопасный выбор для многопоточного кода.
Часто задаваемые вопросы
Урок «Генерация случайных чисел» бесплатный?
Да — полный текст урока «Генерация случайных чисел» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Генерация случайных чисел»?
Random и ThreadLocalRandom Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Генерация случайных чисел»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Класс Math
- Генерация случайных чисел
- Случайные диапазоны и перемешивание
- Округление и ограничения в Math