Skip to content

byounghoonkim/monty_hall

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 

Repository files navigation

Golang으로 몬티 홀 문제(Monty Hall Problem) 시뮬레이션 해보기

몬티 홀 문제란 한 퀴즈 쇼에서 경품을 선택하는 방식에서 유래한 확률 문제이다.

경품의 선택 방식은 자동차 경품과 꽝을 의미하는 염소가 2마리 숨겨져 있는 세 개의 문이 있다. 퀴즈 쇼 참가자는 이 문들 중 하나를 고른다.(문을 열지 않고 기다린다.) 이때 퀴즈쇼 진행자는 참가자가 고르지 않은 두 문 중 자동차가 아닌 염소가 있는 문 하나를 열어 준다.(진행자는 어느 문 뒤에 자동차가 있는지 알고 있다.) 그리고 참가자에게 기존의 선택을 고수할지 다른 하나의 문으로 선택을 바꿀지 선택권이 주어진다. 이때 기존의 선택을 유지해야 할까 선택을 바꾸어야 할까?

세 개 중에 하나를 골랐고 선택권을 바꾸어도 동일한 확률일 것 같은 생각이 든다.

Monty Hall Image

그러나 이 문제를 해설한 위키 페이지를 보면 선택권을 바꾸지 않은 경우는 경품을 받을 확률이 1/3 이고 선택권을 바꿀 경우 확률이 2/3 로 올라 간다고 설명하고 있다.

확률이 올라가는 이유는 경품의 위치를 알고 있는 진행자가 염소가 있는 문을 열어 꽝의 확률을 제거하였기 때문이라고 한다.

좀 더 쉬운 설명을 하자면 처음 선택 시 자동차를 고를 확률은 1/3, 염소를 고를 확률은 2/3 이므로 선택을 고수할 때에 처음 자동차를 고른 경우(1/3)에도 자동차를 획득할 확률은 1/3 이고 염소를 고른 경우(2/3)에서 여전히 선택을 고수 했으므로 염소를 고를 확률 역시 2/3 이다. 그러나 선택을 바꿀 경우 처음 자동차를 고른 경우(1/3) 선택권을 바꾸면 염소를 고르게 되므로 염소를 고를 확률이 1/3이 된다. 그리고 염소를 고른 경우(2/3)에 선택권을 바꾸면 이미 진행자가 나머지 염소가 들어 있는 문을 열었기 때문에 무조건 자동차를 고르게 되어 자동차를 고를 확률이 2/3 가 된다.

설명을 들으면 그런 것도 같지만 왠지 한켠으로는 선택권을 고수 하고 싶은 마음이 들기도 한다. 이런 고집스런 마음을 덜어내고자 몬티 홀 문제를 코드로 작성해 돌려보고 통계적으로 선택권을 바꾸는게 더 좋은지 직접 눈으로 확인해 보고 싶었다.

코드를 짜보자 먼저 3개의 문(byte 배열)을 준비하고 G(oat) 2개와 C(ar)를 랜덤하게 배치한다.

	doors := [3]byte{'G', 'G', 'G'} // Goat
	doors[rand.Intn(3)] = 'C'       // Car

처음 선택은 세개의 문중 하나를 랜덤하게 선택한다.

	firstSelection := rand.Intn(3)

처음 선택이 자동차(C)를 골랐다면 나머지 두개의 문중 하나를 랜덤하게 연다(openDoor). 처음 선택이 염소(G)를 골랐다면 나머지 하나의 문을 연다.

	openDoor := -1
	if doors[firstSelection] == 'C' {
		r := rand.Intn(2)

		for i := 0; i < 3; i++ {
			if firstSelection == i {
				continue
			} else {
				if r == 0 {
					openDoor = i
					break
				}
				r--
			}
		}

	} else {
		for i := 0; i < 3; i++ {
			if i != firstSelection && doors[i] == 'G' {
				openDoor = i
				break
			}
		}
	}

선택권을 바꾸는 경우(changeMind == true)는 나머지 하나의 문으로 secondSelection을 지정하고 그 문에 C가 있는지 확인해 결과를 리턴한다. 선택권을 바꾸지 않는 경우는 처음 선택(firstSelection)의 문에 C가 있는지 확인해 결과를 리턴한다.

	if true == changeMind {
		secondSelection := -1
		for i := 0; i < 3; i++ {
			if i != firstSelection && i != openDoor {
				secondSelection = i
				break
			}

		}
		return doors[secondSelection] == 'C'

	} else {
		return doors[firstSelection] == 'C'
	}

전체 코드는 여기에서 볼 수 있다.

위와 같은 코드를 선택권을 바꾸는 경우와 바꾸지 않는 경우에 각각 10000회를 실행해 자동차를 선택한 경우의 횟수를 보면 아래와 같이 선택권을 바꾼 경우가 약 2/3(약 66%) 정도의 확률로 자동차를 선택하는데 성공했다.

Monty Hall
Change mind false => 3379 / 10000 (33.790 %)
Change mind  true => 6624 / 10000 (66.240 %)

처음 선택이 모두 옳은 것은 아니다. 옳지 않다는 것이 밝혀 지면 주저 없이 선택을 바꾸자. 살면서 몬티 홀 문제가 주어지면 자신 있게 선택권을 바꾸자!

Releases

No releases published

Packages

No packages published

Languages