몬티 홀 문제를 프로그래밍 언어로 풀어봅니다.
새로운 문을 선택할때 정말 승리확률이 66퍼가 나올까?
몬티홀 문제
염소를 뽑느냐, 스포츠카를 뽑느냐
- 몬티홀 문제는 조건부 확률과 베이즈 정리를 통해서, 선택을 바꾸는것이 당첨될 확률이 높아지는것이 증명된 문제이다.
- 필자의 경우 해당 문제를, 경시대회를 준비하던 초등학생때 수학이랑 관련된 무슨 책에서 처음 접했던 기억이 난다.
- 몬티홀 문제를 대충 요약하자면 아래와 같다.
1 |
|
- 일반적인 직관에 따르면, 선택을 바꾸지 않으나, 바꾸나 그 구간에서 1/2 을 선택하므로
50%
확률인 것처럼 보인다. - 하지만, 선택을 바꾸지 않으면 확률은
33%
이고, 선택을 바꿀경우 확률은66%
로 두배나 상승한다. - 여기서 주목해서 봐야할 조건은 사회자는 염소가 존재하는 문을 항상 연다는것이다. 항상
- 즉, 참가자가 첫선택에 자동차가 있는 문을 선택해도, 염소가 존재하는 2개의 문중 하나의 문을 무조건적으로 연다는 것이다
- 이 문제에 대한 해설은 위키에서 보도록하자.
- 이해가 안가도 괜찮다.
- 당시 최고의 수학자인 폴 에르되시도 통계적인 자료가 나오기 전까지는 66퍼 인것을 받아들이지 못했다고 한다.
프로그래밍을 해보자.
- 필자의 경우에도 66퍼인것을 받아들이기가 굉장히 힘들었던 기억이 있다.
- 하지만 이제는 프로그래밍 역량이 전혀 없던 초등학생이 아니므로, 한번 프로그래밍으로 문제를 구현하여 정말로 확률이 저렇게 달라지는지 확인해보자.
객체지향적으로 짜보려다가, 그냥 나이브하게 작동만을 위한 구현을 해보았다.
JAVA
1 |
|
1 |
|
- 1만번의 수행을 해보았다.
- 선택을 바꾸는 경우에는
66%
에 근접한 결과가 나왔다. - 선택을 바꾸지 않는 경우에는
33%
라는 결과가 나왔다.
c++
1 |
|
1 |
|
- class를 쓰지 않고, C 스타일로 나이브하게 작성해 보았다.
- 언어만 다를뿐 로직은 완전히 동일하다.
- 랜덤값을 만드는 부분에서
srand()
를 사용하지 않았다.- 이 이유는 이전 포스팅의 링크를 걸며 대신한다.
결론
선택을 바꾸는것이 승리 확률이 두배나 높다!
- 프로그램에 문제가 없다면, 귀납적으로 결론을 내는데 성공했다.
- 이해가 안갔어도 이제는 받아들이자
여담으로 이런 문제해결을 하기 위해 프로그래밍을 하는것에 엄청 재미를 느끼는데, 이 글을 쓰면서도 내내 즐거웠다.
10분내 짧게 쓰려고 했던 글이지만 벌써 40분이 지났네..