FeelingXD

Python 으로 알아보는 몬티홀(Monty-hall) 문제 🤔 본문

프로그래밍/알고리즘

Python 으로 알아보는 몬티홀(Monty-hall) 문제 🤔

FeelingXD 2024. 2. 17. 23:20

몬티홀 문제(monty-hall problem)

Suppose you’re on a game show, and you’re given the choice of three doors. Behind one door is a car, behind the others, goats. You pick a door, say #1, and the host, who knows what’s behind the doors, opens another door, say #3, which has a goat. He says to you, "Do you want to pick door #2?" Is it to your advantage to switch your choice of doors?
당신이 한 게임 쇼에서 3개의 문 중에 하나를 고를 수 있는 상황이라고 가정하자. 한 문 뒤에는 자동차가, 다른 두 문 뒤에는 염소가 있다. 당신이 1번 문을 고르자, 문 뒤에 무엇이 있는지 아는 사회자는 3번 문을 열어서 염소를 보여줬다. 그리고는 "2번 문으로 바꾸시겠습니까?"라고 물었다. 이 상황에서, 당신의 선택을 바꾸는 게 유리할까?

규칙

  • 닫혀 있는 문 3개가 있다.
  • 한 문 뒤에는 상품(=자동차)이 있고, 나머지 두 문은 꽝(=염소)이다.
  • 참가자는 이 3가지 문 중 하나를 골라야 상품을 얻을 수 있다.
  • 참가자가 문 하나를 고르면, 이미 상품이 어딨는지 알고 있는 사회자는 남은 2가지 문 중에 하나를 열고 그게 '꽝'이라는 사실을 밝힌다.
  • 여기서 참가자에게 다른 문으로 바꿀 수 있는 기회가 주어진다.

왜 66% 일까 🤔

쉽게보는 66.6% 이유

우리는 남은 문 중 새로 선택한다고 착각하게된다.!

  1. 처음에 정답 문을 고를 확률 1/3
  2. 사회자가 보여주고 문을 바꾸는 기회를 준다면 전체 확률의 관점에서는 위의 그림과 같이 2/3 가된다. (3개중 2개를 고를확률과 같다.)

코드

# 몬티홀 문제
"""
닫혀 있는 문 3개가 있다.
한 문 뒤에는 상품(=자동차)이 있고, 나머지 두 문은 꽝(=염소)이다.
참가자는 이 3가지 문 중 하나를 골라야 상품을 얻을 수 있다.
참가자가 문 하나를 고르면, 이미 상품이 어딨는지 알고 있는 사회자는 남은 2가지 문 중에 하나를 열고 그게 '꽝'이라는 사실을 밝힌다.
여기서 참가자에게 다른 문으로 바꿀 수 있는 기회가 주어진다.
"""
import random


def mc_pick(participant_choice, answer):
    while True:
        pick = random.randint(0, 2)
        if pick != participant_choice and pick != answer:
            break
    return pick


def monty_hall_problem():
    """
    정답과 사용자의 선택은 랜덤이다.
    """
    answer = random.randint(0, 2)
    participant_choice = random.randint(0, 2)
    mc_choice = mc_pick(answer, participant_choice)

    new_choice = set(
        [i for i in range(3) if i not in (mc_choice, participant_choice)]
    ).pop()
    # 바꿔서 정답인경우, 바꾸지않아서 정답인경우

    return [answer == participant_choice, answer == new_choice]


if __name__ == "__main__":
    not_change_cnt = 0
    change_cnt = 0
    for _ in range(case := 100_000):  #
        not_change, change = monty_hall_problem()
        change_cnt = change_cnt + 1 if change else change_cnt
        not_change_cnt = not_change_cnt + 1 if not_change else not_change_cnt
    print(f"result {change_cnt =} , {not_change_cnt=}")

    pass

시행횟수가 늘어날수록 .. 바꿧을때의 승률이 66% 에 수렴한다. !

참고

몬티홀 쉽게알아보기

'프로그래밍 > 알고리즘' 카테고리의 다른 글

[백준-16928] 뱀과 사다리게임  (0) 2024.02.17