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

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

125 голосов
/ 01 ноября 2011

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

158 голосов
/ 01 ноября 2011
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 s это просто:

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);
}
42 голосов
/ 18 мая 2013

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

19 голосов
/ 01 ноября 2011

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

1 голос
/ 21 июня 2018

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

int myNumber = new Random().nextInt(11) + 10
0 голосов
/ 12 июня 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...