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

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

Другие вопросы по тегам