3 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개인 경우가 아니라 그 이상인 경우라도 무조건 바꾸는 게 유리함을 알 수 있습니다.
확률이란 단어를 아무 데나 써 주는 센스 작렬!
대형차를 타면 기름값 지출 커질 확률 높아
밥을 많이 먹으면 배가 부를 확률 높아
높은 곳에서 뛰어내리면 뼈가 부러질 확률 높아
잠을 적게 자면 피곤할 확률 높아
자식이 없으면 교육비 생활비가 적게 들 확률 높아
하루종일 운전하면 교통사고 당활 확률 높아
광우병걸린 소를 많이 먹으면 광우병 걸릴 확률 높아
컴퓨터를 오래 하면 전기요금이 많이 나올 확률 높아
한국에 태어나면 한국말을 잘 할 확률 높아
비율이면 비율이지 왜 여기서 확률이 나오는거야