[Java] Math.random( ) 원하는 범위 설정하기
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;