Как получить случайное число
Случайное целое число от 1 до 6 (бросок кубика):
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random random = new Random();
int dice = random.nextInt(6) + 1;
System.out.println(dice);
}
}random.nextInt(6) возвращает одно из чисел 0, 1, 2, 3, 4, 5 — от нуля до 6 не включая 6. Если прибавить 1, получится 1…6. При каждом запуске число своё.
Число в диапазоне от min до max
int value = random.nextInt(max - min + 1) + min;Например, от 10 до 20 включительно: random.nextInt(11) + 10. С Java 17 то же можно записать короче: random.nextInt(10, 21) — первая граница включается, вторая нет.
Создайте один объект Random и берите из него все числа — создавать новый перед каждым числом не нужно.
Через Math.random
Math.random() возвращает дробное число от 0.0 до 1.0 (единица не включается). Импорт не нужен:
int dice = (int) (Math.random() * 6) + 1;Скобки здесь важны. (int) Math.random() * 6 всегда даёт 0: сначала Math.random() превращается в int — это всегда 0, — и только потом умножается на 6.
Другие случайные значения
| Что нужно | Как |
|---|---|
| Дробное от 0.0 до 1.0 | random.nextDouble() |
true или false | random.nextBoolean() |
| Большое целое | random.nextLong() |
| Случайный элемент массива | arr[random.nextInt(arr.length)] |
| Перемешать список | Collections.shuffle(list) |
Одна и та же последовательность
Если передать в Random число — зерно (seed), — последовательность «случайных» чисел будет одинаковой при каждом запуске:
Random random = new Random(42);Это удобно для отладки и тестов: программа ведёт себя предсказуемо. В обычной работе зерно не указывают.
Подводные камни
- Пароли, коды подтверждения, ключи нельзя делать через
RandomиMath.random: их последовательность можно угадать. Для этого естьjava.security.SecureRandom— у него те же методыnextIntи другие. - В программах с несколькими потоками (частями программы, которые работают одновременно) удобнее
ThreadLocalRandom.current().nextInt(1, 7)из пакетаjava.util.concurrent. - Неповторяющиеся числа (например, 5 разных из 36) проще всего получить так: сложить все варианты в список, перемешать через
Collections.shuffleи взять первые 5.