One Gift, Two Goats
몬티 홀(Monty Hall). 초등학생 때 스타크래프트 공식 대회 맵 이름으로 처음 접하고, 예비대학생 때 어떤 경제학 교양 서적에서 처음으로 그 의미를 알게 되었던 문제. 군대 첫 후임이 전입 온 첫날 알려줘서 그날 야간 연등 시간에 붙들고 머리를 싸매며 풀어봤던 문제. 그때는 흡족해 하며 잠에 들었지만, 어제 넷플릭스 시리즈 <DP>를 보다가 다시 발견했을 때는, 도통 무슨 소리인지 이해가 안 됐다.
https://ko.wikipedia.org/wiki/%EB%AA%AC%ED%8B%B0_%ED%99%80_%EB%AC%B8%EC%A0%9C
몬티 홀 문제 - 위키백과, 우리 모두의 백과사전
세 개의 문 중에서 1번 문 뒤에 차가 있을 것이라 선택했을 때, 진행자는 3번 문 뒤에는 염소가 있음을 보여주면서 1번 문 대신에 2번문을 선택하겠냐고 물었다. 몬티 홀 문제(영어: Monty Hall problem)
ko.wikipedia.org
몬티 홀 문제를 접할 때마다 직관적으로 떠오르는 내 해답은 둘 중 하나였다.
1. 선물이 세 개의 문 중 하나에 놓여지는 시점에 이미 확률이 1/3이다.
2. 문이 열린 이후로 선택지는 두 개로 좁혀졌으니 무얼 택하든 확률은 1/2이다.
하지만 수학은 이같은 직관이 틀렸음을 보여준다.
[1번 문] 참가자의 첫 선택 | [2번 문] | [3번 문] | |
Case 1 | 선물 | 염소 | 염소 |
Case 2 | 염소 | 선물 | 염소 |
Case 3 | 염소 | 염소 | 선물 |
Case 1의 경우 참가자가 선택을 바꾸면 무조건 염소를 받게 된다.
Case 2의 경우 진행자가 [3번 문]을 보여주고, 참가자는 선택을 바꾸면, 즉 [2번 문]을 택하면 선물을 받는다.
Case 3의 경우 진행자가 [2번 문]을 보여주고, 참가자는 선택을 바꾸면, 즉 [3번 문]을 택하면 선물을 받는다.
결국 참가자는 3개의 문 사이에서 고민하는 것이 아니라, 3개의 경우(Case) 사이에서 고민하는 셈이다.
참가자가 처한 상황이 [Case 1]일 확률은 1/3, [Case 2, 3]일 확률은 2/3인데
이 말인즉슨 선택을 고수해서 선물을 받을 확률은 1/3, 선택을 바꿔서 선물을 받을 확률은 2/3인 것이다.
혹시나 이게 "저번 학기에는 수강 신청이 8시라서 힘들었다. 이번 학기에는 9시라서 좀 낫겠다." 식의 말장난은 아닐까 싶어 실험을 해 봤다.
from random import choice
NUM_EXP = 10_000_000 # 실험횟수 설정
def main():
cnt_exp = 0
cnt_hold_win = 0
cnt_change_win = 0
while cnt_exp < NUM_EXP: # 정해놓은 실험횟수만큼 반복한다.
doors = ["Door 1", "Door 2", "Door 3"] # [1번] [2번] [3번] 세 개의 문이 있다.
gift = choice(doors) # 세 문 중 하나를 열면 선물이 있다.
goats = [door for idx, door in enumerate(doors) if door != gift] # 나머지 두 개의 문을 열면 염소가 있다.
# 참가자는 항상 [1번] 문을 선택하고,
closed_goat = goats[0] # 사회자가 항상 두 개의 염소 중 가장 오른쪽에 있는 문을 연다고 가정하자.
# 그렇다면 사회자가 열지 않은 염소는 두 개의 염소 중 가장 왼쪽에 있는 문이다.
if closed_goat == "Door 1": # [1번]이 사회자가 열지 않은 염소일 경우
cnt_change_win += 1 # 선택을 바꿀 때 승리하는 케이스의 수를 1만큼 더한다
else: # [1번]이 사회자가 열지 않은 염소가 아닌 경우(즉 선물인 경우)
cnt_hold_win += 1 # 선택을 고수할 때 승리하는 케이스의 수를 1만큼 더한다
cnt_exp += 1 # 지금까지의 실험횟수를 센다.
prob_hold_win = cnt_hold_win / cnt_exp * 100
prob_change_win = cnt_change_win / cnt_exp * 100
print(f"총 {cnt_exp:,}회 시행에서\n \
선택을 고수하는 것이 승리한 횟수는 {cnt_hold_win:,}회\n \
선택을 고수하는 것이 승리할 확률은 {round(prob_hold_win, 2)}% 이고,\n \
\n \
선택을 바꾸는 것이 승리한 횟수는 {cnt_change_win:,}회\n \
선택을 바꾸는 것이 승리할 확률은 {round(prob_change_win, 2)}% 입니다.")
main()
결과는 놀랍게도
고전경제학의 "인간은 합리적 존재다"라는 가정에 이의를 제기하는, 행동경제학자들은 '인간의 직관이 합리적이지 않다'는 대표적인 근거로 몬티 홀 문제를 든다고 한다. 나도 그 가정이 불완전함에는 동의하지만, 직관의 함정에 충격을 받은 사람들이 직관에 덜 의존하게 된다는 점을 들면, 오히려 동태적인 관점에서 "인간은 합리성을 증진하는 존재다"라는 주장도 가능하다.
다시 몇 년이 지나 이 문제를 만났을 때 내가 '세 개의 문'이 아니라, 더욱 넓은 관점에서 '세 개의 경우'를 머릿속으로 떠올린다면, 아주 적절한 근거가 될 것이다. 나는 그런 사람이 될 것이다.