Как стать автором
Обновить

Парадокс Монти-Холла и имитационное моделирование

Время на прочтение3 мин
Количество просмотров7.4K

Парадокс Монти Холла


Парадокс Монти Холла — одна из известных задач теории вероятностей, решение которой, на первый взгляд, противоречит здравому смыслу. Задача формулируется как описание гипотетической игры, основанной на американском телешоу «Let’s Make a Deal», и названа в честь ведущего этой передачи. Наиболее распространенная формулировка этой задачи, опубликованная в 1990 году в журнале Parade Magazine, звучит следующим образом:
Представьте, что вы стали участником игры, в которой вам нужно выбрать одну из трех дверей. За одной из дверей находится автомобиль, за двумя другими дверями — козы. Вы выбираете одну из дверей, например, номер 1, после этого ведущий, который знает, где находится автомобиль, а где — козы, открывает одну из оставшихся дверей, например, номер 3, за которой находится коза. После этого он спрашивает вас, не желаете ли вы изменить свой выбор и выбрать дверь номер 2. Увеличатся ли ваши шансы выиграть автомобиль, если вы примете предложение ведущего и измените свой выбор?

Решение


При решении этой задачи обычно рассуждают примерно так: после того, как ведущий открыл дверь, за которой находится коза, автомобиль может быть только за одной из двух оставшихся дверей. Поскольку игрок не может получить никакой дополнительной информации о том, за какой дверью находится автомобиль, то вероятность нахождения автомобиля за каждой из дверей одинакова, и изменение первоначального выбора двери не дает игроку никаких преимуществ. Однако такой ход рассуждений неверен. Если ведущий всегда знает, за какой дверью что находится, всегда открывает ту из оставшихся дверей, за которой находится коза, и всегда предлагает игроку изменить свой выбор, то вероятность того, что автомобиль находится за выбранной игроком дверью, равна 1/3, и, соответственно, вероятность того, что автомобиль находится за оставшейся дверью, равна 2/3. Таким образом, изменение первоначального выбора увеличивает шансы игрока выиграть автомобиль в 2 раза. Этот вывод противоречит интуитивному восприятию ситуации большинством людей, поэтому описанная задача и называется парадоксом Монти Холла.
Подробности можно узнать в соответствующей статье Википедии

Моделирование


Так как абстрактное логическое мышление в этот раз мне почему-то отказало, пришлось призвать на помощь брутфорс — имитационную модель, в которой я и производил дальнейшую проверку.
Код скрипта (PHP). Замечания по коду приветствуются.
Результат:
Number of games: 10000.
Gamer wins 6664 times.
Gamer looses 3336 times.

<?php
$wins=0;
$looses=0;
$change_choice = 1; //По умолчанию

for ($i=1;$i<=10000;$i++){
	$car_position = rand(1,3);

	#Let's begin
	#Step 1
	$gamer_first_choice = rand(1,3);
	$showman_choice = rand(1,3);
	while($showman_choice==$gamer_first_choice || $showman_choice==$car_position){
		$showman_choice=rand(1,3);
	}
	#echo "Car is in ".$car_position." door. Gamer choose ".$gamer_first_choice." door, showman opens ".$showman_choice." door. Continue...";

	#Step 2
	if ($change_choice!=0){
		for($second=1;$second<=3;$second++){
			if($second!=$gamer_first_choice && $second!=$showman_choice){
				$gamer_second_choice = $second; //Для наглядности
				}
		}
	}
	#echo "Gamer's first choice is ".$gamer_first_choice.". Showman opens ".$showman_choice." door. Gamer changes choice to ".$gamer_second_choice.".";

	if ($gamer_second_choice==$car_position) {
		#echo 'Gamer won!';
		$wins++;
	} else {
		#echo 'Gamer loose.';
		$looses++;
	}
}
echo "Number of games: ".$i.".
Gamer wins ".$wins." times.
Gamer looses ".$looses." times.";
?>



Альтернативный вариант, написанный знакомым на perl-е:

#!/usr/bin/perl

use strict;
use warnings;

my $iteration = 10000;
my $change_choice = 1;

print "\n";
print modelingMontyHall($change_choice);
print "\n";

sub modelingMontyHall {
	my $change_choice = shift;
	my $success_counter = 0;
	my ( $i, $j );
	my @doors; # 0 - animal, 1 - car
	my $gamer_choice;
	my $showman_open_door;
	my $result = 0;
	my $success_door;

	if ($change_choice) {
		print "Gamer change choice\n"
	} else {
		print "Gamer NOT change choice\n"
	};

	for ( $i = 0 ; $i < $iteration ; $i++ ) {

		# Preparing
		@doors = ( 0, 0, 0 );
		$success_door = int( rand() * 3 );
		$doors[$success_door] = 1; # door with car

		# First step
		$gamer_choice = 0;
		for ( $j = 0 ; $j < 3 ; $j++ ) {
			if ( ( $j != $gamer_choice ) and ( $doors[$j] == 0 ) ) {
				$showman_open_door = $j;
				last;
			}
		}

		# Second step
		if ($change_choice) {
			for ( $j = 0 ; $j < 3 ; $j++ ) {
				if ( ( $j != $gamer_choice ) and ( $j != $showman_open_door ) ) {
					$gamer_choice = $j;
					last;
				}
			}
		}

		# Count result
		if ( $doors[$gamer_choice] ) {
			$result++;
		}
	}
	return $result;
}



Результаты прогона:
Gamer NOT change choice: 2562
Gamer change choice: 7586

P.S.: Кстати, после написания именно этого скрипта я начал относиться к генератору псевдослучайных чисел в движке Zend с долей недоверия. Просто посмотрите ещё раз на результаты прогона в PHP и в Perl :)
P.P.S.: Прошу прощения за оформление кода. Всё делалось «на коленке» и задачи повышения читаемости не стояло.
Теги:
Хабы:
Всего голосов 27: ↑21 и ↓6+15
Комментарии60

Публикации

Истории

Ближайшие события