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().

Ответ 1

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: Для вашего вопроса о 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);
}

Ответ 2

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

Ответ 3

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

Ответ 4

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

int myNumber = new Random().nextInt(11) + 10

Ответ 5

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

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

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