랜덀 μˆ«μžλ“€, 좜처 : https://openclipart.org/detail/254729/random-numbers-cloud

이번 ν¬μŠ€νŒ…μ—μ„œλŠ” Java둜 λžœλ€ν•œ 숫자λ₯Ό νšλ“ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ μ†Œκ°œν•©λ‹ˆλ‹€.

 

μžλ°”μ—λŠ” Math ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.

 

ν•΄λ‹Ή ν΄λž˜μŠ€μ—λŠ” λ‹€μ–‘ν•œ μˆ˜ν•™μ μΈ 계산을 μœ„ν•΄ 기본적으둜 μ œκ³΅ν•΄μ£ΌλŠ” static λ©”μ„œλ“œλ“€μ΄ μ—¬λŸ¬κ°œ μžˆλŠ”λ°,

κ·Έ 쀑에 ν•˜λ‚˜κ°€ random() λ©”μ„œλ“œμž…λ‹ˆλ‹€.

 

이 λ©”μ„œλ“œλŠ” 0μ—μ„œ 1μ‚¬μ΄μ˜ λžœλ€ν•œ double νƒ€μž… 숫자λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

javadoc λ¬Έμ„œμ—λŠ” μ•„λž˜μ™€ 같이 μ„€λͺ…이 λ‚˜μ™€μžˆμŠ΅λ‹ˆλ‹€.

 

random

public static double random()

Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0. Returned values are chosen pseudorandomly with (approximately) uniform distribution from that range.

 

즉, 0.0보닀 ν¬κ±°λ‚˜ κ°™κ³  1.0보닀 μž‘μ€ double(μ‹€μˆ˜)ν˜• 숫자λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 

 

이게 0~1 μ‚¬μ΄μ˜ 수λ₯Ό λ°˜ν™˜ν•˜λ©΄ 이 λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄μ„œ μ–΄λ–»κ²Œ λžœλ€ν•œ 숫자λ₯Ό 얻을 수 μžˆμ„κΉŒμš”?? 

 

예λ₯Ό λ“€μ–΄ 0보닀 ν¬κ±°λ‚˜ κ°™κ³  100보닀 μž‘μ€ 수λ₯Ό κ΅¬ν•˜κ³ μž ν•œλ‹€λ©΄ μ•„λž˜μ™€ 같이 μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

int max = 100;

int randomInt = (int) (Math.random() * max);

 

μœ„ μ½”λ“œμ—μ„œ (int) (Math.random() * max) 뢀뢄은 0 <= κ²°κ³Όκ°’ < max (100) 의 λ²”μœ„ λ‚΄μ˜ 값을 κ°–κ²Œ λ©λ‹ˆλ‹€.

Math.random()의 μ΅œμ†Œκ°’μ΄ 0이고 μ΅œλŒ€κ°’μ΄ 1.0보닀 μž‘κΈ° λ•Œλ¬Έμ΄μ£ . 

 

μ΄λ²ˆμ—λŠ” 100을 ν¬ν•¨ν•˜λ„λ‘ μ½”λ“œλ₯Ό μˆ˜μ •ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

int max = 100;

int randomInt = (int) Math.round(Math.random() * max);

 

Math.round() λ©”μ„œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ 0<= κ²°κ³Όκ°’ <= max (100) λ²”μœ„ λ‚΄μ˜ 값을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. 

 

ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ ν•  경우 0κ³Ό 100이 λ‚˜μ˜¬ ν™•λ₯ μ€ 1~99κ°€ λ‚˜μ˜¬ ν™•λ₯ λ³΄λ‹€ 50% 적게 λ©λ‹ˆλ‹€.

 

0이 λ‚˜μ˜€λ €λ©΄ Math.round()의 값이 0~0.004999...κ°€ λ‚˜μ™€μ•Ό ν•˜κ³ 

100이 λ‚˜μ˜€λ €λ©΄ 0.95~0.9999...κ°€ λ‚˜μ™€μ•Ό ν•©λ‹ˆλ‹€.

 

이 경우 0.5%의 ν™•λ₯ μ„ κ°–κ²Œ λ©λ‹ˆλ‹€.

 

1이 λ‚˜μ˜€λ €λ©΄ 0.005~0.014999..κ°€ λ‚˜μ˜€λ©΄ 되고, 2, 3, 4..., 99 κΉŒμ§€λŠ” λͺ¨λ‘ λ™μΌν•œ ν™•λ₯ μ„ κ°–κ²Œ λ©λ‹ˆλ‹€.

 

이 경우 1%의 ν™•λ₯ μ„ κ°–κ²Œ 되죠.

 

λ”°λΌμ„œ κ³ λ₯΄κ²Œ λΆ„ν¬ν•˜λŠ” 0~100 μ‚¬μ΄μ˜ κ°’(경계포함)을 μ–»μœΌλ €λ©΄ μ’€ 더 고민을 ν•΄μ•Όν•©λ‹ˆλ‹€.

 

그럼 μ–΄λ–»κ²Œν•΄μ•Ό 0~100 μ‚¬μ΄μ˜ 숫자λ₯Ό λͺ¨λ‘ λ™μΌν•œ ν™•λ₯ λ‘œ 얻을 수 μžˆμ„κΉŒμš”??

 

int max = 100;
int randomInt = (int) (Math.random() * (max + 1));

κ°„λ‹¨ν•©λ‹ˆλ‹€. maxλ₯Ό ν¬ν•¨ν•˜κ³ μž ν•  경우 max + 1을 κ³±ν•΄μ£Όλ©΄ λ§Œμ‚¬OKμž…λ‹ˆλ‹€. 

 

자, 그럼 μ΅œμ†Œκ°’μ˜ λ²”μœ„λ₯Ό μ •ν•΄μ£Όκ³  μ‹ΆμœΌλ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒμš”?

 

int min = 90, max = 100;
int randomInt = (int) (Math.random() * (max + 1 - min)) + min;

μœ„ 처럼 ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

 

즉, λžœλ€ν•˜κ²Œ μ΅œλŒ€κ°’μ—μ„œ μ΅œμ†Œκ°’μ„ λΊ€ 만큼의 숫자λ₯Ό λ§Œλ“  뒀에 μ΅œμ†Œκ°’μ„ λ”ν•΄μ£ΌλŠ”κ±°μ£ . 

 

μ—¬κΈ°μ„œλŠ” μ΅œλŒ€κ°’ 100μ—μ„œ 1을 λ”ν•˜κ³  μ΅œμ†Œκ°’ 90을 λΉΌμ„œ μ΅œμ†Œ 0~ μ΅œλŒ€ 10이 λ‚˜μ˜€λ„λ‘ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. 

 

κ±°κΈ°λ‹€κ°€ min(90)값을 더해주면 0+90 ~ 10+90 μ‚¬μ΄μ˜ 수, 즉, 90~100 μ‚¬μ΄μ˜ 수λ₯Ό 얻을 수 있게되죠. 

 

ν•˜λ‚˜ν•˜λ‚˜ λ”°λΌκ°€λ‹ˆ 어렡지 μ•Šμ£ ?

 

μ˜€λŠ˜λ„ 즐거운 μ½”λ”©ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€~