Math.random () пояснення


133

Це досить просте 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().


Для [3,5]:(int)Math.floor(Math.random()*3) + 3
good_evening

9
BTW: діапазон від 0,0 включно до 1,0 ексклюзив (ви ніколи не отримаєте акуратного 1,0) Використання nextInt () - набагато кращий вибір не тільки простіше, але й набагато швидше.
Пітер Лоурі

2
Використання Math.ceilнеправильно, це дає неправильний результат при Math.random()поверненні 0.
starblue

Що робити, якщо Math.floor повертає 0,029? Як завжди отримати двоцифрове число за допомогою одного твердження?
Найшель Вердхан

Відповіді:


165
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: Що стосується вашого питання про doubles, це просто:

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

1
Що робити, якщо ви не використовуєте (int)і хочете повернути його double?
Switchz

Якщо ви хочете подвоїтись, просто замініть ints на doubles (а набір тексту не потрібен). Я припускав, що ви хочете int, але я додам до своєї посади.
AusCBloke

2
Насправді з doubles видалити + 1також, оскільки Math.random()його не обрізають. Однак діапазон буде [хв, макс), оскільки Math.random"Повертає подвійне значення з позитивним знаком, більшим або рівним 0,0 та менше 1,0". Існує б дуже мінімальна ймовірність того, що це число maxвсе одно точно, навіть якщо це можливо.
AusCBloke

44

Якщо ви хочете генерувати число від 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 є виключним.


2
upperboundексклюзивний? Я думаю, це буде всеосяжно.
видить

1
@vidit це ексклюзивно

1
не думайте, що ви отримаєте велику верхню межу картини, як це передбачено в прикладі
Teezy7

19

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


Я оновив своє запитання, я хотів би знати, як це зробити Math.random(). Дякую.
Switchz

1

Щоб створити число від 10 до 20 включно, ви можете використовувати java.util.Random

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

0

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

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

Загалом, він знаходить абсолютну відстань між кордонами, отримує відповідне випадкове значення, а потім зміщує відповідь на основі нижньої межі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.