Привет по ту сторону экрана.
Любой из нас рано или поздно встречается с необходимостью генерировать случайное число в заданном нами диапазоне будь то вещественное или целое число.
Для чего? На самом деле это не важно, это может быть функция для расчета шанса для запуска какого нибудь события, получение случайного множителя или любого другая.
Итак, для чего это нужно разобрались, а именно для чего угодно :)
На самом деле методов получения псевдослучайного числа очень много, я же приведу пример с классом
Math
, а именно с методом random()
;
Что же мы имеем?
Вызов метода Math.random()
возвращает псевдослучайное вещественное число (double
) из диапазона [0;1)
, то есть, от 0 до 1 исключая 1, а значит максимальное число в диапазоне это 0.99999999999...
Хорошо, мы получили псевдослучайное число, но если нам нужен свой диапазон? К примеру, нам нужно псевдослучайное число из диапазона [0;100)?
Пишем код:
public static void main(String... args)
{
final double max = 100.; // Максимальное число для диапазона от 0 до max
final double rnd = rnd(max);
System.out.println("Псевдослучайное вещественное число: " + rnd);
}
/**
* Метод получения псевдослучайного вещественного числа от 0 до max (исключая max);
*/
public static double rnd(final double max)
{
return Math.random() * max;
}
Получилось не плохо, но max
(в нашем случае) мы все равно не получим.
Для того чтобы получить случайное число в диапазоне [0;100] нам необходимо прибавить к нашему max
1, а затем преобразовать в целое число типа int
или long
(зависит от диапазонов которые Вы будете использовать).
Пишем код:
public static void main(String... args)
{
final int max = 100; // Максимальное число для диапазона от 0 до max
final int rnd = rnd(max);
System.out.println("Псевдослучайное целое число: " + rnd);
}
/**
* Метод получения псевдослучайного целого числа от 0 до max (включая max);
*/
public static int rnd(int max)
{
return (int) (Math.random() * ++max);
}
Примечание: Как видите переменная max была инкрементирована префиксной формой. (Если Вы не знаете что это советую почитать мою статью)
Отлично, мы получили то что хотели, но если нам нужен диапазон не от 0, а к примеру [10;75]
Пишем код:
public static void main(String... args)
{
final int min = 10; // Минимальное число для диапазона
final int max = 75; // Максимальное число для диапазона
final int rnd = rnd(min, max);
System.out.println("Псевдослучайное целое число: " + rnd);
}
/**
* Метод получения псевдослучайного целого числа от min до max (включая max);
*/
public static int rnd(int min, int max)
{
max -= min;
return (int) (Math.random() * ++max) + min;
}
Разбор кода из метода rnd
:
Минимальное число диапазона = 10;
Максимальное число диапазона = 75;
max -= min; // Отнимаем от максимального значения минимальное для получения множителя псевдослучайного вещественного числа.
Максимальное число после расчета равно 65
Псевдослучайное вещественное число (к примеру) равно 0.18283417347179454 (Был получен при вызове Math.random()
). Максимальное число перед умножением было инкрементировано префиксной формой. Максимальное число теперь 66
Умножаем 0.18283417347179454 на 66. Результат умножения равен 12.06705544913844. Преобразовываем результат умножения максимального числа на псевдослучайное вещественное число к типу целого числа int
. Прибавляем минимальное число к преобразованному результату который равен 12. Возвращаем результат: 22
Как видно из разбора, даже если псевдослучайное вещественное число будет равно нулю, то мы вернем наш минимум в результате сложения нашего минимального числа с результатом умножения.
Надеюсь для Вас это было полезно и познавательно.
Успехов в освоении Java ;)
Еще пару моих статей:
Что такое инкрементирование и декрементирование
Оператор деления по модулю
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Простой пример:
(Можно задать итератор и по нему путешествовать)
Для мультипоточных
docs.oracle.com/javase/tutorial/essential/concurrency/threadlocalrandom.html