java에서 Math.random()이라는 함수가 있는데 난수 생성을 하는 함수이다.
Math.random()은 임의의 로또 번호 생성, 숫자야구게임, 주사위 굴리기 등 많은 곳에서
활용할 수 있는데 주사위 굴리기의 코드 일부를 구현하면서 의문이 생겼다.
일단 먼저 Math.random() 함수는 난수를 생성하는 함수로
0 ~ 0.9 사이의 임의의 숫자를 난수로 생성해준다.
이후 이 난수에 * 10을 한 뒤 + 1을 해줘서 1 ~ 9까지의 랜덤한 정수를 생성한다.
int number = (int)(Math.random() * 10 + 1);
주사위 만들기
그렇다면 주사위를 만들때는 어떻게 할까?
개인적으로는 1 ~ 9까지의 정수를 생성한후 7, 8, 9가 나올 경우에 대한 예외처리를 할것이라고
바로 생각이 들었는데 구글링을 해본 결과 아래 코드와 같은 방법을 썼다.
int number = (int)(Math.random() * 6 + 1);
위의 코드처럼 사용한다면 자칫 잘못하면 공평한 확률의 숫자가 나오지 않을수도 있겠다 라는 생각이
들수도 있지만 다시 생각해보면 너무나도 공평한 숫자가 나오게 되어 있다.
이유는
Math.random() 함수는 0 ~ 0.99999.. 까지의 숫자를 만들어 내고
거기에 6을 곱한다면 0부터 5.xx의 최대값을 가지는 숫자가 나올 것이기 때문에
거기에 1을 더하는 방식으로 주사위의 6개숫자를 표현할 수 있다.
int one, two, three, four, five, six;
one = two = three = four = five = six = 0; // 1부터 6까지 숫자 초기화
int garbage = 0; // 7~9 // 7 ~ 9까지의 숫자가 나올경우 카운트
for (int i = 0; i < 1000000; i++) {
int number = (int)(Math.random() * 6 + 1); // 1 ~ 6까지 난수 생성
switch (number) {
case 1:
one++;
break;
case 2:
two++;
break;
case 3:
three++;
break;
case 4:
four++;
break;
case 5:
five++;
break;
case 6:
six++;
break;
default:
garbage++; // 7 ~ 9 까지의 숫자가 생성될시
break;
}
if (number == 1 || number == 2 || number == 3 || number == 4 || number == 5 ||
number == 6) { // 1 ~ 6까지 예외처리
continue;
}else { // 1 ~ 6까지 말고 이외의 숫자가 나올시 다시 반복문 진행
i--;
}
}
위 코드와 같은 실행결과를 돌려보면 정확히 각 숫자별로 16% 가량의 확률을 가지고 나오는 것을 볼 수 있다.
또한 7 ~ 9까지의 숫자는 백만번을 돌릴동안 단 한번도 나오질 않았다.
위 코드는 사실 1 ~ 10부터 숫자를 난수로 생성한 후 7 ~ 9를 예외처리 하기 위해 만든 코드인데
지금과 같이도 활용이 됐다.
int one, two, three, four, five, six;
one = two = three = four = five = six = 0;
int garbage = 0; // 7~9
for (int i = 0; i < 1000000; i++) {
int number = (int)(Math.random() * 10 + 1);
switch (number) {
case 1:
one++;
break;
case 2:
two++;
break;
case 3:
three++;
break;
case 4:
four++;
break;
case 5:
five++;
break;
case 6:
six++;
break;
default:
garbage++;
break;
}
if (number == 1 || number == 2 || number == 3 || number == 4 || number == 5 ||
number == 6) {
continue;
}else {
i--;
}
}
위 코드 처럼 10까지의 정수를 생성하고 예외처리를 할 경우 7 ~ 9까지의 숫자 카운트가 쌓이는 것을 볼 수 있다.
'web > JAVA & SpringBoot' 카테고리의 다른 글
[JAVA] 정규 표현식 (0) | 2022.11.23 |
---|---|
[JAVA] map이란 (0) | 2022.11.19 |
[JAVA] static 이란? (0) | 2022.11.10 |
public static void main(String[] args) 의 의미 (0) | 2022.11.08 |
Java 표기법 (카멜 표기법 / 스네이크 표기법 / 파스칼 표기법) (0) | 2022.11.07 |