Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Markdown
- GarbageCollector
- 배열 돌리기1
- Greedy
- GC
- 빌더패턴
- DP
- 백준
- 몬티홀
- 회고
- 마크다운
- 그리디
- 적정 스레드
- 분할정복
- 정수론
- 구현
- 그래프탐색
- springboot
- Python
- github
- BFS
- 그래프 탐색
- 문제풀이
- 면접복기
- Stack
- 프로세스
- deque
- 브루트포스
- g1gc
- 이진탐색
Archives
- Today
- Total
FeelingXD
Python 으로 알아보는 몬티홀(Monty-hall) 문제 🤔 본문
몬티홀 문제(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% 일까 🤔
우리는 남은 문 중 새로 선택한다고 착각하게된다.!
- 처음에 정답 문을 고를 확률 1/3
- 사회자가 보여주고 문을 바꾸는 기회를 준다면 전체 확률의 관점에서는 위의 그림과 같이 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 |
---|