2 posts tagged “몬티홀”
아래에 올린 몬티홀 문제 시뮬레이션 프로그램은 처음에는 다음과 같이 확률만 짧게 구한 버젼이었습니다.
코드 길이 줄이는 게 목적이 아니라서 충분히 짧진 않네요. 행수 줄이는 게 목적이라면 확 줄여서 단지 몇 줄로 줄긴 합니다만.
#!/usr/bin/perl
use strict;
use warnings;my $choices = 3;
my $game_count = 0;
my $success_count = 0;
my $fail_count = 0;my $will_change = 1;
while ($game_count < 1000) {
$game_count++;
# 차가 있는 문 번호를 랜덤하게 지정
my $car_door_number = int(rand($choices));
# 출연자가 선택한 문 번호를 랜덤하게 지정
my $chosen_door_number = int(rand($choices));
# 출연자가 '차가 있는 문 번호'를 선택한 경우
if ( $chosen_door_number == $car_door_number ) {
# 바꾸면 꽝, 안바꾸면 車
if ($will_change) {
$fail_count++;
} else {
$success_count++;
}
# 출연자가 '꽝'인 문 번호를 선택한 경우
} else {
# 바꾸면 車, 안바꾸면 꽝
if ($will_change) {
$success_count++;
} else {
$fail_count++;
}
}
}print "GAMES COUNT : $game_count\n";
print "SUCCEDED : $success_count\n";
print "FAILED : $fail_count\n";
여튼 이렇게 간단히 만들 수 있는 기반은 다음과 같습니다.
- 문 3개 중 꽝은 2개, 차는 1개 이므로 출연자가 처음에 차를 고를 확률이 33%, 꽝을 고를 확률이 66%.
- 처음에 차를 고른 경우 선택을 바꾸면 무조건 꽝
- 처음에 꽝을 고른 경우 선택을 바꾸면 무조건 차
- 따라서 선택을 변경하는 경우, 처음에 차를 고른 경우 결국 꽝, 처음에 꽝을 고른 경우 결국 차
- 그러므로 선택을 변경하는 경우, 결국 33% : 꽝, 66% : 차
- 처음에 차를 고른 경우 선택을 안바꾸면 당연히 차
- 처음에 꽝을 고른 경우 선택을 안바꾸면 당연히 꽝
- 따라서 처음 선택을 유지하면, 당연히 처음에 차를 골랐으면 그대로 차, 꽝을 골랐으면 그대로 꽝
- 그러므로 처음 선택을 유지하는 경우, 처음 선택 확률과 동일하게 33% : 차, 66% : 꽝
즉 차냐 꽝이냐의 확률은 결국 처음 선택에 완전히 종속됩니다. 선택을 바꿀 경우 처음에 꽝을 골라야 결국 차를 탈 수 있는데, 처음 꽝을 고를 확률이 66%라서 처음에 차를 고를 확률 33%의 두 배가 됩니다. 반면 처음 선택을 유지한다면 처음에 차를 골랐어야 하는데, 처음에 차를 고를 확률은 33%죠. 따라서 선택을 바꾸는 게 유리하죠.
근데 이렇게 만들고 보니 이건 중간과정 생략하고 경우에 따른 결과만 가지고 만든 것 같아서 시뮬레이션이 아니더라고요.^^
실행결과는 아래 프로그램이랑 똑같습니다. 당연히 같을 수밖에 ㅎㅎ
유명한 몬티홀 문제인데, 다재다능 만화가 마사님의 블로그에서 또 보게 된 김에
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개인 경우가 아니라 그 이상인 경우라도 무조건 바꾸는 게 유리함을 알 수 있습니다.