Java

[Java] Math.random( ) 원하는 범위 설정하기

ImKDM 2022. 9. 14. 01:10
728x90

 

 

Math.random( ) 의 원리는 다음과 같다.

 

0.0    < =    Math.random( )    <    1.0

 

단순히 Math.random( ) 메서드를 사용하면 0.0   ~   0.99999999 .... 사이의 무수한 값이 나온다.

 

for (int i = 0; i < 30; i++) {
	System.out.println(Math.random());
}

/*
0.7302990489669005
0.5315799439653189
0.9161182076315438
0.4549021564110568
0.3703879366108085
0.7652893869329384
0.5082149789032587
0.41097925368425814
0.8843778908777832
0.8295590192374546
0.8322787353311684
0.38523774534679067
0.03379477488839
0.24803050445422925
...
...
...

*/

 

만약 1 부터 10 까지 무작위 숫자를 뽑고 싶다면 어떻게 해야할까??

 

모든변에 10 을 곱해보자.

 

0.0  *  10  < =    Math.random( )  *  10    <    1.0  *  10

0.0   < =    Math.random( ) *  10    <    10.0

 

Math.random( ) 범위는 0.0  ~  9.9999999 ... 이 된다.

여기에 (int) 형 변환을 붙여서 소수점을 없앤다.

 

0.0  (int)  < =    Math.random( )  *  10  (int)    <    10.0  (int)

0   < =    Math.random( ) *  10  (int)    <    10

 

소수점 이하는 사라져서 Math.random( )의 범위는 0  ~  9 까지 된다.

이제 원하는 시작 지점을 더한다.

 

0.0  + 1  < =    Math.random( )  *  10  (int) + 1    <    10.0  + 1

1   < =    Math.random( ) *  10  (int) + 1    <    11

 

범위는 1  ~  10 으로 좁혀진다.

 

 

다시 말해서 Math.random( ) 에 곱하는 수는 "해당 범위에 나올 수 있는 수의 개수" 가 된다.

해당 수를 구하는 공식은 " 가장 큰 수  -  가장 작은 수  +  1 " 이다.

그리고 더하는 수는 범위의 '시작 위치'가 된다.

 

(int) Math.random() * (가장 큰 수 - 가장 작은 수 + 1) + 가장 작은 수

 

예시로,  만약 126 506 까지의 범위에서 무작위 수를 구하려면 어떻게 해야할까?

 

정답은,

(int) ( Math.random( )  *  (506  -  126  +  1) )  +  126;

(int) ( Math.random( )  *  381 )  +  126;