Выпадковыя ліку з Math.random () у Java

Для генерацыі выпадковых лікаў, я выкарыстаў формулу:

<Код> (INT) (Math.random() * макс) + мін

Формула я знаходжу на Google заўсёды, здаецца:

<Код> (INT) (Math.random() * (макс - мін) + мін)

Які з іх мае рацыю? Наколькі я ведаю, я ніколі не атрымаў нумар, які быў з майго дыяпазону з маёй формулай

12
Я ўпэўнены, што паўтузіна адказаў шукаюць лёгкія акуляры будуць сказаць, калі я абнавіць старонку: ваш няправільна. Ваш макс павінен сапраўды быць названы Дыяпазон або шырыня .
дададзена аўтар BlueRaja - Danny Pflughoeft, крыніца
Вы, здаецца, шчасліўчык.
дададзена аўтар WannaBeCoder, крыніца

11 адказы

Ваша формула генеруе лік паміж мін і мін + макс.

Адзін Google знайшоў генеруе лік паміж мін і макс.

Google перамагае!

14
дададзена
Для паўнаты карціны, калі вы кажаце, «поўны», вы маеце на ўвазе ў тым ліку і выключаючы макс ?
дададзена аўтар Maarten, крыніца

Лепшы падыход:

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

Ваша формула генеруе лік паміж і мін + макс .

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
дададзена

Ваш: нізкая магчыма з'яўляецца мін, максімальна магчымы складае макс + мін-1

Google: Самыя нізкія магчыма гэта мін, максімальна магчымы з'яўляецца макс-1

5
дададзена
Math.random() не вяртае 1
дададзена аўтар Alex, крыніца
Гэта праўда. Такім чынам, -1.
дададзена аўтар F.J, крыніца

калі = 10 мін і макс = 100 :

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

дае вынік паміж 10 і 110, у той час як

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

дае вынік паміж 10 і 100, так што <моцны> яны вельмі розныя формулы . Што важна тут яснасць, так што вы робіце, пераканайцеся, што код становіцца ясна, што генеруецца.

(PS. Першы мае сэнс, калі вы зменіце значэнне зменнай "Макс" будзе называцца «Дыяпазон»)

2
дададзена

Першы з іх генеруе лік ў няправільным дыяпазоне, а другі з'яўляецца правільным.

Для таго, каб паказаць, што першы адзін няправільны, скажам, мін 10 і тах 20. Іншымі словамі, вынік, як чакаецца, будзе больш або роўна дзесяці, і строга меней за дваццаць. Калі Math.random() вяртае 0,75 , вынік першай формуле 25 , які выходзіць за межы дыяпазону.

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

гэта дасць вам выпадковы лік у дыяпазоне ад 10 да 20 гадоў.

Ключавым момантам тут з'яўляецца:

a + Math.random()*b

пачатковая Num (10) і заканчваючы Num гэта максімальны лік (20) - (10) а + 1 (11)

Атрымлівайце асалоду ад!

2
дададзена
Прывітанне Джэйсан, гледзячы на ​​Javadoc для Math.random, яна вяртае двайны> = 0,0, але <1,0. Калі выказаць здагадку, што дзесятковая дакладнасць, як паказана (дзесятыя), (10 + Math.random() * 11 будзе вяртаць значэння ў дыяпазоне 10..19, а не 20. [Math.random() 'ы макс вал складае 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
дададзена

Калі = 5 мін і макс = 10 і Math.random() вяртае (амаль) 1.0, згенераваны нумар будзе (амаль ) 15, які відавочна больш, чым абраны тах .

Relatedly, таму кожны выпадковы лік 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() * макс) вагаецца ад 0 у макс-1 ўключна.

Тады (INT) (Math.random() * макс) + мін вагаецца ад да макс + мін - 1 , які не з'яўляецца тое, што ты хочаш.

формула Google з'яўляецца правільнай.

0
дададзена

Там невялікая праблема з формулай, якую вы знайшлі ў Google.it павінен быць (INT) (Math.random() * (макс - мін + 1) + мін) не (цэлае) (Math.random() * (макс - мін) + мін) .

0
дададзена