네이버 캐스트 - 문티 홀 문제
직관의 허망함을 증명해 주는 문제라 하겠습니다.
반대로 논리적 사고 과정의 중요성을 보여주고요.
이걸 이해 하려면 일단은 문제를 잘 이해해야하고,(수학도 국어를 잘해야 잘합니다)
조건부 활률이란 수학적 지식이 필요한데,
일단 본인은 예전부터 확률엔 무지했던지라 (보통 평범한 공과 출신들은 미적분만 잘합니다)
명백한 수학적 설명을 보고도 확실하게는 이해를 못하겠더군요.
이럴 땐 프로그래밍을 해 보면 의외로 슆게 풀리기도 하는데요.
프로그래밍이라는게 결국 논리와 수학을 바탕으로 한 인간적인 감정이나 직관이 배제된 기계적 논리의 흐름이다 보니
코드를 짜다 보면 자연스럽게 그 논리의 과정을 거치는 사고를 하게 됩니다.
이를테면 관념을 영어로 즉시에 구사하지는 못하더라도 한국어로 구체화한 다음 영어로 번역하여 말하는 것과 비슷한 셈입니다.
만약 그렇지 않다면 제 두뇌구조가 독특한 것 일지도 모르겠습니다...;
아무튼......
3개의 문에서 하나만 차, 나머지는 염소가 있고,
1개의 문을 선택하고, 사회자가 나머지 다른 문을 하나 열었을 때 염소가 나왔다면,
[최초의 선택을 변경했을 때 차를 얻을 것인가 염소를 얻을 것인가]를 반복적으로 시도해서 카운팅하는 프로그래밍을 하면 다음의 과정으로 코딩하게 됩니다.
nTry : 시도 횟수
nCar : 차가 위치한 문의 번호
nSelected : 최초 선택한 문의 번호
nMonty : 몬티 홀이 선택하여 염소임을 확인해 준 문의 번호
totalCar : 차 획득수
totalGoat : 염소 획득수
이렇게 돌려보면 선택을 변경할때 차를 얻을 확률이 대략 66%가 나옵니다.
문이 3개가 아닌 N개라고 가정하면 아래처럼 선택 변경시의 차 획득 확률을 추가로 고려하면 됩니다.
N개 의 문에서 선택을 변경한다면
최초 선택이 차가 아닌 염소일 확률이 (N-1)/N 이고 선택을 변경할 땐 N-2 개중에서 하나를 고르므로
(N-1)
------------ 의 확률로 차를 획득합니다.
N (N-2)
선택을 변경하지 않는다면
최초 선택이 차일 확률이 1/N 이므로.... 1/N 의 확률로 차를 획득합니다.
문이 몇개이든 선택을 변경하는 것이 확률상 유리합니다.
위에 예시된 코드는 이해를 돕는 의사코드일 뿐 입니다.
실제 소스와 실행 파일은 첨부합니다.
직관의 허망함을 증명해 주는 문제라 하겠습니다.
반대로 논리적 사고 과정의 중요성을 보여주고요.
이걸 이해 하려면 일단은 문제를 잘 이해해야하고,(수학도 국어를 잘해야 잘합니다)
조건부 활률이란 수학적 지식이 필요한데,
일단 본인은 예전부터 확률엔 무지했던지라 (보통 평범한 공과 출신들은 미적분만 잘합니다)
명백한 수학적 설명을 보고도 확실하게는 이해를 못하겠더군요.
이럴 땐 프로그래밍을 해 보면 의외로 슆게 풀리기도 하는데요.
프로그래밍이라는게 결국 논리와 수학을 바탕으로 한 인간적인 감정이나 직관이 배제된 기계적 논리의 흐름이다 보니
코드를 짜다 보면 자연스럽게 그 논리의 과정을 거치는 사고를 하게 됩니다.
이를테면 관념을 영어로 즉시에 구사하지는 못하더라도 한국어로 구체화한 다음 영어로 번역하여 말하는 것과 비슷한 셈입니다.
만약 그렇지 않다면 제 두뇌구조가 독특한 것 일지도 모르겠습니다...;
아무튼......
3개의 문에서 하나만 차, 나머지는 염소가 있고,
1개의 문을 선택하고, 사회자가 나머지 다른 문을 하나 열었을 때 염소가 나왔다면,
[최초의 선택을 변경했을 때 차를 얻을 것인가 염소를 얻을 것인가]를 반복적으로 시도해서 카운팅하는 프로그래밍을 하면 다음의 과정으로 코딩하게 됩니다.
nTry : 시도 횟수
nCar : 차가 위치한 문의 번호
nSelected : 최초 선택한 문의 번호
nMonty : 몬티 홀이 선택하여 염소임을 확인해 준 문의 번호
totalCar : 차 획득수
totalGoat : 염소 획득수
totalCar := 0
totalGoat := 0
for i := 1 to nTry do
begin
nCar := Random(3)
nSelected := Random(3)
if nCar = nSelected then
begin
totalGoat := totalGoat + 1 // 선택을 변경하면 항상 염소의 문을 열기 때문에
end
else
begin
repeat
nMonty := Random(3)
until (nMonty <> nCar) and (nMonty <> nSelected) // 몬티 홀의 선택
totalCar := totalCar + 1 // nMonty 와 nCar는 염소이므로 나머지는 항상 자동차
end
end
Chance := totalCar / nTry * 100
end
else
begin
repeat
nMonty := Random(3)
until (nMonty <> nCar) and (nMonty <> nSelected) // 몬티 홀의 선택
totalCar := totalCar + 1 // nMonty 와 nCar는 염소이므로 나머지는 항상 자동차
end
end
Chance := totalCar / nTry * 100
이렇게 돌려보면 선택을 변경할때 차를 얻을 확률이 대략 66%가 나옵니다.
문이 3개가 아닌 N개라고 가정하면 아래처럼 선택 변경시의 차 획득 확률을 추가로 고려하면 됩니다.
totalCar := 0
totalGoat := 0
for i := 1 to nTry do
begin
nCar := Random(N)
nSelected := Random(N)
if nCar = nSelected then
begin
totalGoat := totalGoat + 1 // 선택을 변경하면 항상 염소의 문을 열기 때문에
end
else
begin
repeat
nMonty := Random(N)
until (nMonty <> nCar) and (nMonty <> nSelected) // 몬티 홀의 선택,
repeat
nSelected2 := Random(N)
until (nSelected2 <> nSelected) and (nSelected2 <> nMonty) // 선택을 변경
if nSelected2 = nCar then
totalCar := totalCar + 1
else
totalGoat := totalGoat + 1
end
end
Chance := totalCar / nTry * 100
end
else
begin
repeat
nMonty := Random(N)
until (nMonty <> nCar) and (nMonty <> nSelected) // 몬티 홀의 선택,
repeat
nSelected2 := Random(N)
until (nSelected2 <> nSelected) and (nSelected2 <> nMonty) // 선택을 변경
if nSelected2 = nCar then
totalCar := totalCar + 1
else
totalGoat := totalGoat + 1
end
end
N개 의 문에서 선택을 변경한다면
최초 선택이 차가 아닌 염소일 확률이 (N-1)/N 이고 선택을 변경할 땐 N-2 개중에서 하나를 고르므로
(N-1)
------------ 의 확률로 차를 획득합니다.
N (N-2)
선택을 변경하지 않는다면
최초 선택이 차일 확률이 1/N 이므로.... 1/N 의 확률로 차를 획득합니다.
문이 몇개이든 선택을 변경하는 것이 확률상 유리합니다.
위에 예시된 코드는 이해를 돕는 의사코드일 뿐 입니다.
실제 소스와 실행 파일은 첨부합니다.