Подтвердить что ты не робот

Случайные числа с Math.random() в Java

Для генерации случайных чисел я использовал формулу:

(int)(Math.random() * max) + min

Формула, которую я нахожу в Google, всегда выглядит следующим образом:

(int)(Math.random() * (max - min) + min)

Какое право? Насколько я знаю, я никогда не получал число, которое было вне моего диапазона, с моей формулой

4b9b3361

Ответ 1

Ваша формула генерирует числа между min и min + max.

Найденный Google генерирует числа между min и max.

Google выигрывает!

Ответ 2

Лучший подход:

int x = rand.nextInt(max - min + 1) + min;

Ваша формула генерирует числа между min и min + max.

Random random = new Random(1234567);
int min = 5;
int max = 20;
while (true) {
    int x = (int)(Math.random() * max) + min;
    System.out.println(x);
    if (x < min || x >= max) { break; }
}       

Результат:

10
16
13
21 // Oops!!

Смотрите его здесь: ideone

Ответ 3

Ваш: минимально возможный минимум, максимально возможный максимум + мин-1

Google: минимально возможное значение min, максимально возможное значение max-1

Ответ 4

Первый генерирует числа в неправильном диапазоне, а второй правильный.

Чтобы показать, что первая неверна, скажем, min равно 10, а max равно 20. Другими словами, ожидается, что результат будет больше или равен десяти, и строго меньше двадцати. Если Math.random() возвращает 0.75, результат первой формулы равен 25, который находится за пределами диапазона.

Ответ 5

если min=10 и max=100:

(int)(Math.random() * max) + min        

дает результат между 10 и 110, а

(int)(Math.random() * (max - min) + min)

дает результат между 10 и 100, поэтому они очень разные формулы. Что важно здесь, ясность, поэтому, что бы вы ни делали, убедитесь, что код дает понять, что генерируется.

(PS. первый смысл имеет смысл, если вы измените переменную "max" на "диапазон" )

Ответ 6

int i = (int) (10 +Math.random()*11);

это даст вам случайное число от 10 до 20.

Ключ здесь:

a + Math.random()*b

начальное число (10) и окончание num - максимальное число (20) - a (10) + 1 (11)

Наслаждайтесь!

Ответ 7

Если min = 5 и max = 10, а Math.random() возвращает (почти) 1,0, сгенерированное число будет (почти) 15, что явно больше, чем выбранный max.

Кроме того, поэтому каждый случайный номер API должен указывать минимальные и максимальные значения. Вам не нужно писать математические ошибки, которые касаются вашего проблемного домена.

Ответ 8

Google прав: -)

Формула Google создает числа между: min и max Ваша формула создает числа между: min и (min + max)

Ответ 9

Math.random()

Возвращает двойное значение с положительным знаком, большим или равным 0,0 и менее 1,0.

Теперь это зависит от того, чего вы хотите достичь. Если вы хотите, чтобы номера от 1 до 100, например, вам просто нужно добавить

(int)(Math.random()*100)

Итак, 100 - это диапазон значений. Если вы хотите изменить начало диапазона до 20 к 120, вам нужно добавить +20 в конец.

Итак, формула:

(int)(Math.random()*range) + min

И вы всегда можете рассчитать диапазон с max-min, поэтому Google дает вам эту формулу.

Ответ 10

Math.random() генерирует число от 0 (включительно) и 1 (исключение).

Итак, (int)(Math.random() * max) варьируется от 0 до max-1 включительно.

Затем (int)(Math.random() * max) + min находится в диапазоне от min до max + min - 1, что вам не нужно.

Правильная формула Google.

Ответ 11

Есть небольшая проблема с формулой, которую вы нашли в Google. Так должно быть:
(int)(Math.random() * (max - min + 1) + min)
не
(int)(Math.random() * (max - min) + min).

max - min + 1 - диапазон, в котором могут быть сгенерированы случайные числа