A.I(인공지능)/Datascience

몬티홀 문제를 시뮬레이션을 통해 해결해보자!

JackSmith 2024. 10. 20.

 

아래 문제를 풀어보자!

 

Q. Monty Hall 문제는 확률을 기반으로 한 의사결정 문제입니다. 문 3개 중 하나에 자동차가 있고, 다른 두 개에는 염소가 있습니다. 참가자가 문 하나를 고르면, 진행자가 다른 두 문 중 하나를 열어 염소를 보여줍니다. 그 후, 참가자가 선택을 바꿀지 결정해야 합니다. 선택을 바꾸는 것이 유리한 이유를 설명하세요.

 

 

몬티홀문제에 대해서 처음 들어본다면 아래 영상을 참고하세요.

 

몬티홀 문제는 확률세계에서 대단히 유명하면서도, 컴퓨터를 통한 시뮬레이션을 진행하기 이전까지는 찬반이 팽배했던 문제이다.

이 문제의 핵심은 다음과 같다.

 

처음 선택한 문에 자동차가 없을 확률은 2/3이므로, 선택을 바꾸면 2/3의 확률로 자동차를 얻게 된다.

어떤 문이 열릴 지 알 수 없다면 항상 변수가 변한다는 것이다.

 

하지만 상식적으로는 이에 대한 이해가 잘 되지 않으니, 다음과 같은 순서도 코드를 구현해보려고 한다.

이걸 코드로 구현하면 다음과 같다.

import numpy as np

# 몬티홀 시뮬레이션 함수
def monty_hall_simulation(trials=10000, switch=True):
    wins = 0
    for _ in range(trials):
    	# 염소 두마리, 자동차 하나를 리스트에 삽입
        doors = [0,0,1] # Two goats (0) and one car (1)
        
        # 순서가 있는 리스트를 무작위로 섞음
        np.random.shuffle(doors)
        
        # 하나의 문을 고름
        initial_choice = np.random.randint(0,3) #0,1,2중에 하나의 값을 무작위로 선택(0번째 문, 1번째 문, 2번째 문)중 하나를 고름
        
        # 그 문을 제외한 다른 문들 중에서 염소가 있는 문을 리스트에 저장
        available_doors = [i for i in range(3) if i != initial_choice and doors[i] == 0]
        
        # 리스트에 있는 문중 하나를 선택(opened_door)
        opened_door = np.random.choice(available_doors)
        
        if switch:
        	# 초기선택과 나머지 하나의 문을 제외하고, 다른 하나의 문을 선택(remaining_door) 
            remaining_door = [i for i in range(3) if i != initial_choice and i != opened_door][0]
            if doors[remaining_door] == 1:
                wins += 1
        else:
            if doors[initial_choice] == 1:
                wins += 1
    return wins / trials

trials = 10000
switch_win_rate = monty_hall_simulation(trials, switch=True)
no_switch_win_rate = monty_hall_simulation(trials, switch=False)



print(f"초기선택을 바꾸기로 했을경우, 우승할 확률: {switch_win_rate}")
print(f"초기선택을 유지하기로 했을 경우, 우승할 확률: {no_switch_win_rate}")

 

결과는 다음과 같다.

초기선택을 바꾸기로 했을경우, 우승할 확률: 0.6656
초기선택을 유지하기로 했을 경우, 우승할 확률: 0.3343

 

이렇게 초기선택을 바꿨을 경우 확률이 2/3가 되는 것을 시뮬레이션을 통해 입증할 수 있었다.

 

댓글