
Language: C++
Date: 2022.07.19
2022년, 고등학교 3학년 화법과 작문 수업 시간에 몬티 홀 문제에 관한 화법 지문을 보게 되었다.
(2023 수능특강 화법과 작문 p.214.)

당시 이 지문을 접했을 때, 왜 선택을 바꾸면 2/3인지, 선택을 바꾸지 않으면 1/3 인지 와닿지 않았다.
단순히 생각해봤을 때, 원래 3개 문에서 1개를 고르는 것이니 1/3 임은 자명하고 거기서 꽝인 한 문이 열렸으니 두 문중 한 문에 상품이 있다라고 하면, 1/3에서 1/2 로 늘어나긴 하지만 상품을 가질 확률이 두 문이 1/2과 1/2 로 동일할 것이라 생각했다.
하지만, 선택을 바꾸면 2/3였고 안바꾸면 1/3이라는 결과가 나오는 것이었다.
이에 대해서 설명을 들어도 잘 이해되지 않았고, 내 눈으로 직접 봐야 인정할 것 같았다.
큰 수의 법칙(통계학)에 따르면, 시행 횟수가 늘어날수록 실제 측정한 확률(통계적 확률)이 수학적으로 예측한 확률(수학적 확률)에 수렴할 확률이 1에 가까워진다. 따라서, 큰 수의 법칙에 따라 프로그램을 활용해 매우 많은 시도를 해 본다면, 수학적 확률인 몬티 홀 문제를 증명해볼 수 있으리라 생각했다.
문 3개가 있고 한 문 뒤에는 상품이 있고 나머지 두 문은 꽝이 있다. 참가자가 한 문을 고르고, 사회자는 남은 두 문 중에 꽝인 문 한 문을 열어줘 참가자에게 사회자가 연 문은 꽝임을 보여준다. 이때, 참가자에게 다른 문을 선택할 기회가 주어지는데, 이 선택을 바꿀지 아닐지에 대한 문제이다.
일반적인 컴퓨터는 완전한 난수(random)를 만들 수 없다. 따라서 의사난수 생성기(Pseudo-random)라고 한다. 여기서 'Pseudo'라는 단어는 '허위의'라는 뜻을 담는다. 즉, 수학적 계산으로 만들어지기 때문에 함수관계가 있다. 다만, 최근에는 일반적인 cpu에 TPM 2.0 기능이 탑재되고, 완전한 난수가 생성될 수 있다. 하지만, 이것은 컴퓨터가 자체적으로 만드는 것은 아니고, 자연계의 무작위 사건(노이즈 신호, 방사성 동위 원소의 방출 방사선 등)을 입력받아 이용한 방법이다.
의사난수 생성기 중 '메르센 트위스터(Mersenne Twister) 생성기'는 기존 생성기들의 문제점을 피하고, 질 좋은 난수를 빠르게 생성할 수 있어 많이 채택되고 있다.
따라서 나는 이 프로젝트에서 메르센 트위스터 생성기를 사용했고, 균등분포로 뽑아 증명했다. 메르센 트위스터는 C++의 mt19937를 활용해 사용할 수 있고, 균등분포는 uniform_int_distribution을 통해 사용할 수 있다.
사용자가 선택을 바꾸는 경우와, 선택을 고수하는 경우 두 가지 경우를 각각 다른 파일로 작성했고, 각각 100만번 반복시행 했다.
https://github.com/abc3279/Computational-Demonstration-of-the-Monty-Hall-Problem

결과를 보면, 선택을 바꿨을 때 66.6%에 수렴한다는 것을 알 수 있고, 바꾸지 않고 선택을 고수했을 때 33.3%에 수렴한다는 것을 알 수 있다.