본문 바로가기

Java

몬티홀 문제(Monty Hall problem)를 Java로 풀어보자

몬티홀 문제의 답이 마지막에 선택을 바꾸는 것이 확률이 2/3이 되므로 더 유리하다는 사실은 이전에 언급한 바가 있다.

몬티홀 문제에 대해 모르시는 분들은 아래 링크된 글을 읽고 오시면 이해가 됩니다


이해가 안간다고 좌절하지 말자.

이 문제에 대해 처음 언급했을때 수천통의 수학, 공학 박사학위 소지자들이 확률이 2/3이 되지 않는다며 항의 메일을 보냈고


20세기 후반 최고의 수학자라고 불려지던 전설적인 수학자 폴 에어디쉬도 선택을 바꾸든 아니든 확률은 같다고 생각했고, 컴퓨터로 실험해본 뒤에야 바꾸는 것이 유리한 선택임을 인정했다고 한다. (이불킥!)






그리고 그 문제에 대해 말이나 표로 증명하지 않고 이젠 실제로 시뮬레이션을 돌려보고자 한다.
언어는 무엇이되든 상관없는데 그냥 자바로 풀어봤다.


public class MonteHall {

public static void main(String[] args) {


int testno = 100;

Random random = new Random();

// 오로지 0번만 선택

int choice = 0;


System.out.println("난 심지있는사람! 결과를 바꾸지 않는다");

int resultcnt = 0;

//문의 종류는 0번,1번,2번이다.

for (int i = 0; i < testno; i++) {

int car = random.nextInt(3);// 0,1,2

if (choice == car)

resultcnt++;

}

System.out.println("Result: " + (double) resultcnt / (double) testno);


choice = 0;

resultcnt = 0;

System.out.println("결과를 바꾸면?");

for (int i = 0; i < testno; i++) {

int car = random.nextInt(3);// 0,1,2


// change!

if (car == 0) {

// 사회자는 나머지 문 2개중 아무거나 열어준다.

choice = random.nextInt(2) + 1;

} else if (car == 1) {

// 사회자는 열어 줄 문이 2번문 뿐이다. 그래서 선택을 바꾼다면 바꿀 수 있는 문은 1번문 뿐이다.

choice = 1;

} else if( car == 2){

// 사회자는 열어 줄 문이 1번문 뿐이다. 그래서 선택을 바꾼다면 바꿀 수 있는 문은 2번문 뿐이다.

choice = 2;

}


if (choice == car)

resultcnt++;

}

System.out.println("Result: " + (double) resultcnt / (double) testno);


}

}




위와 같이 돌릴 경우

Random함수를 썼기때문에 결과는 바뀔 수 있다(testno의 변수를 늘리면 정확해짐)


난 심지있는사람! 결과를 바꾸지 않는다

Result: 0.31

결과를 바꾸면?

Result: 0.67



따라서 시뮬레이션 결과 결과를 바꾸는 것이 확률이 2/3가 되어 자동차를 가져갈 수 있다!