Как сгенерировать случайные целые числа в определенном диапазоне на 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"?
Как сгенерировать случайную алфавитно-цифровую строку
Java Random возвращает отрицательные числа