Как сгенерировать случайные целые числа в определенном диапазоне на Java?
Как сгенерировать случайное значение типа int
в заданном диапазоне?
Я столкнулся с проблемой при попытке сгенерировать случайное целое число в определенном диапазоне. У меня есть несколько методов реализации, но они содержат ошибки, связанные с переполнением целого числа.
Вот один из методов:
randomNum = minimum + (int)(Math.random() * maximum);
// Ошибка: `randomNum` может быть больше `maximum`.
И еще один метод:
Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum = minimum + i;
// Ошибка: `randomNum` может быть меньше `minimum`.
Как правильно реализовать генерацию случайного числа, чтобы избежать этих проблем и гарантировать, что результат будет в нужном диапазоне? Буду благодарен за любые рекомендации или исправления!
5 ответ(ов)
Вы можете использовать следующий код для генерации случайного числа:
Random ran = new Random();
int x = ran.nextInt(6) + 5;
В этом коде переменная x
будет содержать случайное целое число, которое может принимать значения от 5
до 10
включительно. Метод nextInt(6)
генерирует случайное число от 0
до 5
, и, добавляя 5
, вы сдвигаете диапазон значений к 5-10
. Таким образом, возможные результаты для x
— это 5
, 6
, 7
, 8
, 9
и 10
.
В вашем случае, чтобы получить случайное значение в заданном диапазоне [minValue, maxValue], вы можете использовать следующий код на Java:
int randomValue = minValue + rn.nextInt(maxValue - minValue + 1);
Здесь rn
- это экземпляр генератора случайных чисел, например, Random
. Этот код работает следующим образом:
rn.nextInt(maxValue - minValue + 1)
генерирует случайное целое число от 0 доmaxValue - minValue
(включительно).- Затем к этому случайному значению прибавляется
minValue
, чтобы сместить диапазон на нужные точки.
Таким образом, вы получите равновероятное целое число в диапазоне от minValue
до maxValue
.
Вы можете отредактировать свой второй код следующим образом:
Random rn = new Random();
int range = maximum - minimum + 1;
int randomNum = rn.nextInt(range) + minimum;
Этот код создаст случайное число в заданном диапазоне от minimum
до maximum
.
В Java существует класс ThreadLocalRandom
, который является эквивалентом java.util.Random
в многопоточной среде. Использование ThreadLocalRandom
позволяет генерировать случайные числа локально для каждого потока, что значительно улучшает производительность за счёт уменьшения конфликтов между потоками.
Пример использования ThreadLocalRandom
для генерации случайного числа в заданном интервале:
int rand = ThreadLocalRandom.current().nextInt(x, y);
Здесь x
и y
— это границы интервала, например, (1,10) для генерации случайного числа от 1 до 9.
Этот подход особенно полезен в многопоточных приложениях, где использование общего экземпляра java.util.Random
может привести к блокировкам и снижению производительности из-за конкурирующих потоков.
Это можно сделать, просто вызвав следующий метод:
Randomizer.generate(0, 10); // Минимум 0 и максимум 10
Ниже приведен его исходный код.
Файл Randomizer.java
public class Randomizer {
public static int generate(int min, int max) {
return min + (int)(Math.random() * ((max - min) + 1));
}
}
На мой взгляд, это просто и понятно.
Генерация случайных целых чисел в JavaScript в заданном диапазоне
Как преобразовать строку в int в Java?
Почему этот код с использованием случайных строк выводит "hello world"?
Сгенерировать случайные целые числа от 0 до 9
Как сгенерировать случайную алфавитно-цифровую строку