Monty Hall Problem

원래도 몬티-홀 문제를 알고는 있었지만 최근에 책을 읽는데 거기에 몬티-홀 문제가 나옴 “n값을 크게 해서 직접 실행해보고 싶다"는 생각이 들었음 아래 글이랑 똑같은 내용이지만 github에도 올렸으니 참고하실 분은 참고하시길 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 import random import matplotlib.pyplot as plt def monty_hall(n): switch_wins = 0 # 문을 바꿔서 이긴 횟수 stay_wins = 0 # 문을 유지해서 이긴 횟수 for _ in range(n): # 자동차가 있는 문을 무작위로 설정 (0, 1, 2 중 하나) car = random.randint(0, 2) # 참가자가 문을 무작위로 선택 (0, 1, 2 중 하나) choice = random.randint(0, 2) # 사회자가 염소가 있는 문을 열음 # 참가자가 선택하지 않은 문 중 자동차가 없는 문을 찾기 possible_doors = [] # 빈 리스트를 만들어서 조건에 맞는 문을 추가 for door in range(3): if door != choice and door != car: possible_doors.append(door) # 사회자가 열 문을 선택 if possible_doors: # possible_doors가 비어있지 않으면 monty_opens = random.choice(possible_doors) else: # 참가자가 자동차를 선택한 경우, 나머지 문 중 하나를 무작위로 열음 remaining_doors = [] # 빈 리스트를 만들어서 조건에 맞는 문을 추가 for door in range(3): if door != choice: remaining_doors.append(door) monty_opens = random.choice(remaining_doors) # 문을 바꾸는 경우: 참가자가 선택하지 않았고 사회자가 열지 않은 문을 찾기 switch_choice = None # 아직 선택된 문이 없음을 표시 for door in range(3): if door != choice and door != monty_opens: switch_choice = door break # 문을 하나 찾았으면 반복문 종료 # 문을 바꿔서 이겼는지 확인 if switch_choice == car: switch_wins += 1 # 문을 유지해서 이겼는지 확인 if choice == car: stay_wins += 1 return switch_wins, stay_wins 1 2 n = 100000000 # 1억 번 switch_wins, stay_wins = monty_hall(n) 1 2 3 4 5 6 7 8 9 10 11 12 13 # 결과 출력 print(f"문을 바꾸는 전략으로 자동차를 얻은 횟수: {switch_wins}") print(f"문을 유지하는 전략으로 자동차를 얻은 횟수: {stay_wins}") print(f"문을 바꾸는 전략의 승률: {switch_wins / num_trials:.4f}") print(f"문을 유지하는 전략의 승률: {stay_wins / num_trials:.4f}") # 시각화 labels = ['Switch', 'Stay'] wins = ****[switch_wins, stay_wins] plt.bar(labels, wins, color=['blue', 'green']) plt.ylabel('Number of Wins') plt.title('Monty Hall Problem Simulation (100M Trials)') plt.show() 1 2 3 4 # 문을 바꾸는 전략으로 자동차를 얻은 횟수: 66663787 # 문을 유지하는 전략으로 자동차를 얻은 횟수: 33336213 # 문을 바꾸는 전략의 승률: 0.6666 # 문을 유지하는 전략의 승률: 0.3334 ...

March 20, 2025