Перейти к основному содержимому

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

· 2 мин. чтения

1. Обзор

В этом уроке мы рассмотрим различные способы генерации случайных чисел в диапазоне.

2. Генерация случайных чисел в диапазоне

2.1. Math.random

Math.random дает случайное двойное значение, которое больше или равно 0,0 и меньше 1,0.

Давайте используем метод Math.random для генерации случайного числа в заданном диапазоне [min, max) :

public int getRandomNumber(int min, int max) {
return (int) ((Math.random() * (max - min)) + min);
}

Почему это работает? Давайте посмотрим, что происходит, когда Math.random возвращает 0.0, что является наименьшим возможным результатом:

0.0 * (max - min) + min => min

Итак, наименьшее число, которое мы можем получить, это min .

Так как 1.0 является исключительной верхней границей Math.random , вот что мы получаем:

1.0 * (max - min) + min => max - min + min => max

Следовательно, исключительная верхняя граница возврата нашего метода равна max .

В следующем разделе мы увидим, что тот же шаблон повторяется с Random#nextInt .

2.2. java.util.Random.nextInt

Мы также можем использовать экземпляр java.util.Random , чтобы сделать то же самое.

Давайте воспользуемся методом java.util.Random.nextInt для получения случайного числа:

public int getRandomNumberUsingNextInt(int min, int max) {
Random random = new Random();
return random.nextInt(max - min) + min;
}

Параметр min (начало координат) является инклюзивным, тогда как верхняя граница max является исключающей.

2.3. java.util.Random.ints

Метод java.util.Random.ints возвращает IntStream случайных целых чисел.

Итак, мы можем использовать метод java.util.Random.ints и возвращать случайное число:

public int getRandomNumberUsingInts(int min, int max) {
Random random = new Random();
return random.ints(min, max)
.findFirst()
.getAsInt();
}

Здесь также указанное минимальное значение происхождения является включающим, а максимальное — исключающим.

3. Заключение

В этой статье мы увидели альтернативные способы генерации случайных чисел в диапазоне.

Фрагменты кода, как всегда, можно найти на GitHub .