Випадкові числа з Math.random () у Java

Для генерації випадкових чисел я використовував формулу:

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

Формула, яку я знаходжу в Google, завжди виглядає так:

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

Який правий? Наскільки я знаю, я ніколи не отримував номер, який був поза моїм діапазоном з моєю формулою

12
Оскільки я впевнений, що до моменту оновлення сторінки ви отримаєте півдюжини відповідей, які шукають легкі окуляри: ваша помилка. Ваш max дійсно має бути названий range або width .
додано Автор BlueRaja - Danny Pflughoeft, джерело
ти, здається, щасливий хлопець.
додано Автор WannaBeCoder, джерело

11 Відповіді

Ваша формула генерує числа між мінімальними та мінімальними + макс.

Один знайдене Google генерує числа між мінімальними та макс.

Google перемагає!

14
додано
Для повноти, коли ви кажете "завершено", ви маєте на увазі min і виключити max ?
додано Автор Maarten, джерело

Кращий підхід:

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!!

See it online here: ideone

8
додано

З повагою: Найнижча кількість можливих - мінімальна, максимальна - max + min-1

Google: найнижча ціна - мінімальна, максимальна - max-1

5
додано
Math.random() не повертає 1
додано Автор Alex, джерело
Це правда. Звідси -1.
додано Автор F.J, джерело

якщо min = 10 і max = 100 :

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

дає результат між 10 і 110, в той час як

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

дає результат між 10 і 100, тому вони дуже різні формули . Тут важлива чіткість, тому що б ви не робили, переконайтеся, що код ясно показує, що створюється.

(PS перший має сенс, якщо ви зміните значення 'max', щоб називатися діапазоном)

2
додано

Перший породжує числа в неправильному діапазоні, а другий - правильним.

Щоб показати, що перший неправильний, скажімо, min становить 10, а max - 20. Іншими словами, очікується, що результат буде більшим або рівним десяти і строго менше двадцяти. Якщо Math.random() повертає 0.75 , результат першої формули становить 25 , що знаходиться за межами діапазону.

2
додано
int i = (int) (10 +Math.random()*11);

це дасть вам випадкове число від 10 до 20.

ключ тут:

a + Math.random()*b

початковий номер (10) і кінець num - максимальне число (20) - a (10) + 1 (11)

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

2
додано
Привіт Джейсон, дивлячись на Javadoc для Math.random, він повертає подвійне значення> = 0.0, але <1.0. Припускаючи десяткову точність, як показано (десятими), (10 + Math.random() * 11 буде повернуто значення в діапазоні 10..19, а не 20. [Макс. Випадковий() max val становить 0,9 0,9 * 11 = 9.9 = 10 + 9.9 = 19.9. Відливання Int знижує його до 19, оскільки це скорочує значення 19.9, а не округляє його (Math.round (double_val) повертає в даному випадку довге значення 20). Тому я думаю отримати діапазон від 10 до 20, вам це буде потрібно: int i = (int) (10 + Math.random() * 12); якщо ви або хтось інший вважає це неправильним, не соромтеся коментувати.
додано Автор Matt Campbell, джерело

Math.random()

     

Повертає подвійне значення з позитивним знаком, більшим чи рівним   0.0 і менше 1.0.

Тепер це залежить від того, що ви хочете виконати. Якщо ви хочете мати цифри від 1 до 100, наприклад, вам просто потрібно додати

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

Тож 100 - діапазон значень. Якщо ви хочете змінити початок діапазону від 20 до 120, вам слід додати +20 в кінці.

Отже, формула:

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

І ви завжди можете обчислити діапазон з максимальним мінімумом, тому Google дає вам цю формулу.

1
додано

Якщо min = 5 і max = 10 , а Math.random() повертає (майже) 1.0, сформований номер буде (майже ) 15, що явно більше, ніж обраний max .

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

1
додано
@ F.J Я додав "майже" заради правильності; Я вибрав 1.0, тому що простіше зрозуміти приклад цілих чисел.
додано Автор millimoose, джерело
Math.random() завжди нижче, ніж 1.0.
додано Автор F.J, джерело

Google правильно :-)

Google's formula creates numbers between: min and max Your formula creates numbers between: min and (min+max)

1
додано

Math.random() generates a number between 0 (inclusive) and 1 (exclusive).

Таким чином, (int) (Math.random() * max) коливається від 0 до max-1 включно.

Тоді (int) (Math.random() * max) + min коливається від min до max + min - 1 , що не є ти хочеш.

Формула Google правильна.

0
додано

Існує невелика проблема з формулою, яку ви знайшли в Google.Він має бути (int) (Math.random() * (max - min + 1) + min) не (int) (Math.random() * (max - min) + min) .

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників