Math.random() объяснение
Это довольно простой вопрос Java (хотя, вероятно, применим ко всем программам):
Math.random()
возвращает число от нуля до единицы.
Если я хочу вернуть целое число от нуля до ста, я бы сделал:
(int) Math.floor(Math.random() * 101)
От ста до ста я бы сделал:
(int) Math.ceil(Math.random() * 100)
Но что, если я хочу получить число от трех до пяти? Будет ли это похоже на следующее утверждение:
(int) Math.random() * 5 + 3
Я знаю о nextInt()
в java.lang.util.Random
, Но я хочу научиться делать это с Math.random()
,
5 ответов
int randomWithRange(int min, int max)
{
int range = (max - min) + 1;
return (int)(Math.random() * range) + min;
}
Выход из randomWithRange(2, 5)
10 раз:
5
2
3
3
2
4
4
4
5
4
Границы включительно, т.е. [2,5], и min
должно быть меньше чем max
в приведенном выше примере.
РЕДАКТИРОВАТЬ: Если кто-то собирался попытаться быть глупым и повернуть вспять min
а также max
Вы можете изменить код на:
int randomWithRange(int min, int max)
{
int range = Math.abs(max - min) + 1;
return (int)(Math.random() * range) + (min <= max ? min : max);
}
EDIT2: на ваш вопрос о double
с, это просто:
double randomWithRange(double min, double max)
{
double range = (max - min);
return (Math.random() * range) + min;
}
И опять же, если вы хотите защитить от идиота, это просто:
double randomWithRange(double min, double max)
{
double range = Math.abs(max - min);
return (Math.random() * range) + (min <= max ? min : max);
}
Если вы хотите сгенерировать число от 0 до 100, тогда ваш код будет выглядеть так:
(int)(Math.random() * 101);
Чтобы сгенерировать число от 10 до 20:
(int)(Math.random() * 11 + 10);
В общем случае:
(int)(Math.random() * ((upperbound - lowerbound) + 1) + lowerbound);
(где lowerbound
включительно и upperbound
эксклюзивные).
Включение или исключение upperbound
зависит от вашего выбора. Скажем range = (upperbound - lowerbound) + 1
затем upperbound
включительно, но если range = (upperbound - lowerbound)
затем upperbound
является эксклюзивным.
Пример: если мне нужно целое число от 3-5, то если диапазон равен (5-3)+1, то 5 включительно, но если диапазон всего лишь (5-3), то 5 эксклюзивно.
Random
класс Java, расположенный в java.util
Пакет послужит вашей цели лучше. У него есть некоторые nextInt()
методы, которые возвращают целое число. Тот, который принимает аргумент int, будет генерировать число от 0 до int, последний не включается.
Чтобы сгенерировать число от 10 до 20 включительно, вы можете использовать java.util.Random
int myNumber = new Random().nextInt(11) + 10
Вот метод, который получает границы и возвращает случайное целое число. Это немного более продвинутый (полностью универсальный): границы могут быть как положительными, так и отрицательными, и минимальные / максимальные границы могут приходить в любом порядке.
int myRand(int i_from, int i_to) {
return (int)(Math.random() * (Math.abs(i_from - i_to) + 1)) + Math.min(i_from, i_to);
}
В общем, он находит абсолютное расстояние между границами, получает соответствующее случайное значение, а затем сдвигает ответ на основе нижней границы.