Math.random () объяснение

133

Это довольно простой вопрос 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().

Switz
источник
Для [3,5]:(int)Math.floor(Math.random()*3) + 3
good_evening
9
Кстати: диапазон составляет от 0,0 включительно до 1,0 исключая (вы никогда не получите 1,0). Использование nextInt () - гораздо лучший выбор, он не только проще, но и намного быстрее.
Питер Лори
2
Использование Math.ceilнеправильно, это дает неправильный результат, когда Math.random()возвращается 0.
звездно-голубой
Что если Math.floor вернет 0.029? Как всегда получить двузначное число с одним утверждением?
Найшил Вердан, 03

Ответы:

165
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в приведенном выше примере.

EDIT: Если кто - то будет пытаться быть глупым и реверса 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: на ваш вопрос о doubles, это просто:

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);
}
AusCBloke
источник
1
Что делать, если вы не используете (int)и хотите вернуть double?
Switz 01
Если вы хотите удвоить, просто замените ints на doubles (и приведение типов не нужно). Я предполагал, что вы хотите ints, но я добавлю в свой пост.
AusCBloke
2
На самом деле с doubles удалить + 1также, так Math.random()как не обрезается. Однако диапазон будет [min, max), поскольку Math.random«Возвращает двойное значение с положительным знаком, большим или равным 0,0 и меньше 1,0». Вероятность того, что число maxвсе равно будет точным, будет минимальной, даже если бы это было возможно.
AusCBloke
44

Если вы хотите сгенерировать число от 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 является исключающим.

Teezy7
источник
2
upperboundэксклюзив? Я думаю, что это будет включено.
видит
1
@vidit это эксклюзив
1
не думайте, что вы можете получить верхнюю границу большой картинки, как показано в примере
Teezy7
19

RandomКласс Java находится в java.utilпакете будет служить вашей цели лучше. У него есть несколько nextInt()методов, возвращающих целое число. Тот, который принимает аргумент int, сгенерирует число от 0 до этого int, последнее не включает.

G_H
источник
Я обновил свой вопрос, я хотел бы знать, как это сделать Math.random(). Спасибо.
Switz 01
1

Чтобы сгенерировать число от 10 до 20 включительно, вы можете использовать java.util.Random

int myNumber = new Random().nextInt(11) + 10
Илья Газман
источник
0

Вот метод, который получает границы и возвращает случайное целое число. Он немного более продвинутый (полностью универсальный): границы могут быть как положительными, так и отрицательными , а границы минимума / максимума могут быть в любом порядке.

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);
}

Как правило, он находит абсолютное расстояние между границами, получает соответствующее случайное значение и затем сдвигает ответ на основе нижней границы.

отказоустойчивой
источник