1 post tagged “추리”
유명한 몬티홀 문제인데, 다재다능 만화가 마사님의 블로그에서 또 보게 된 김에
http://blog.naver.com/masaruchi.do?Redirect=Log&logNo=110027006135
프로그램으로 시뮬레이션을 해 봤습니다.
마사님 블로그 말고도 또 보다 자세한 풀이는 아래 블로그를 비롯하여 여러 분들이 해 주셨습니다.
http://kmstudio.egloos.com/1305809
시뮬레이션해 본 프로그램 코드는 아래와 같습니다.
Perl로 만들긴 했는데, 코드가 간단하고 자세히 주석을 붙여 놨으니 어떤 프로그램 언어든 알고만 계시다면 그냥 보면 아실 수 있습니다.
#!/usr/bin/perl
use strict;
use warnings;# 가능한 선택의 경우의 수 : 3 (0번 문, 1번 문, 2번 문)
my $possible_choice = 3;
# 게임 반복 횟수
my $game_count = 0;
# 성공 횟수
my $success_count = 0;
# 실패 횟수
my $fail_count = 0;# 바꿀 기회가 왔을 때 바꿀 것인가? 1:바꿀 수 있으면 항상 바꾼다, 0:절대로 바꾸지 않는다.
my $will_change = 1;# 게임은 1000번 행한다.
while ($game_count < 1000) {# 게임 카운트 1씩 증가
$game_count++;
# 차가 있는 문의 번호를 가능한 경우의 수 중에서 무작위로 정한다.
my $car_door_number = int(rand($possible_choice));# 차가 없는 문, 즉 꽝인 문 번호들의 리스트를 만든다.
# ex) 문이 3개(0번,1번,2번) 이고, 차가 1번 문에 있다면 꽝인 문 번호들의 리스트는 (0,2) 가 된다.
my @empty_door_numbers;
for (0 .. $possible_choice-1) {
push @empty_door_numbers, $_ unless ($car_door_number == $_);
}# 맨 처음 문 번호를 랜덤하게 하나 고른다.
my $first_chosen_door_number = int(rand($possible_choice));
# 몬티가 '이 문은 꽝입니다' 하고 열어서 보여줄 수 있는 문들의 리스트를 만든다.
# 차가 있는 문이 아니어야 하고, 출연자가 맨 처음에 고른 문 번호도 아니어야 한다.
my @monty_openable_door_numbers;
for ( 0 .. $possible_choice-1 ) {
if ( $_ != $first_chosen_door_number and $_ != $car_door_number ) {
push @monty_openable_door_numbers, $_;
}
}
# 몬티는 자기가 열어서 보여줄 수 있는 문들 중 하나를 열어서 보여준다. 이렇게 해서 열려진, 꽝임이 드러난 문 번호.
my $monty_opened_door_number = $monty_openable_door_numbers[ int(rand(@monty_openable_door_numbers)) ];
# 출연자가 처음 선택을 바꾸어서 '몬티가 열어서 꽝임을 알려준 문'이 아닌 다른 문들 중 하나를 선택하는 경우
# 선택 가능한 문 번호들의 리스트.
# 처음 골랐던 문 번호가 아니어야 하고, 몬티가 열어준 문 번호도 아니어야 한다.
# 문이 3개인 경우는 실제로 하나의 문만 가능하다.
my @second_choosable_door_numbers;
for ( 0 .. $possible_choice-1 ) {
if ( $_ != $first_chosen_door_number and $_ != $monty_opened_door_number ) {
push @second_choosable_door_numbers, $_;
}
}
# 처음 선택을 바꾸어서 다시 다른 문을 선택하는지 아니면 처음 선택을 유지하는지를 정한다.
# 선택을 변경하는 경우는 선택 가능한 문 번호들 중 하나를 임의로 선택한다.
# (문이 3개인 경우는 실제로 선택할 수 있는 문이 하나밖에 없다.)
my $second_chosen_door_number;
if ($will_change) {
$second_chosen_door_number = $second_choosable_door_numbers[ int(rand(@second_choosable_door_numbers)) ];
} else {
$second_chosen_door_number = $first_chosen_door_number;
}
# 마지막으로 선택한 문 번호에 차가 있는지 없는지, 즉 성공/실패 여부를 판별. 성공/실패 카운트 기록.
if ( $second_chosen_door_number == $car_door_number ) {
$success_count++;
} else {
$fail_count++;
}}
print "GAMES COUNT : $game_count\n";
print "SUCCEDED : $success_count\n";
print "FAILED : $fail_count\n";
돌려서 나온 결과는
GAMES COUNT : 1000
SUCCEDED : 702
FAILED : 298
GAMES COUNT : 1000
SUCCEDED : 655
FAILED : 345
GAMES COUNT : 1000
SUCCEDED : 661
FAILED : 339
대충 이렇습니다. 항상 선택을 변경할 경우 최종적인 성공:실패의 비율은 2:1 정도입니다.
변경하지 않으면 반대로 1:2 정도가 되지요.
선택을 바꿀 때 이길 확률이 2/3 즉 66.6% 라는 것이 맞습니다.
절대 그렇게 안 보여도 그게 맞습니다.
* 실제 몬티 홀은 바꿀래 안바꿀래 이런 질문을 한 적이 없다네요 ㅋㅋ 진짜인지는 모르겠습니다.
(다른 쇼 프로그램에서 바꿀래 안바꿀래 질문하는 걸 본 적은 있습니다. 옛날 AFKN 에서^^)
** 사실 확률만 구할 거라면 몇 줄이면 끝납니다만, 최대한 실제 쇼를 진행하는 것과 유사하게 만드느라 길어졌습니다.
*** 가능한 선택의 경우의 수
($possible_choice) 및 바꿀 것인가 말 것인가 ($will_change) 의 값을 바꿔 가면서 테스트해 보면, 꼭
문이 3개인 경우가 아니라 그 이상인 경우라도 무조건 바꾸는 게 유리함을 알 수 있습니다.