Парадокс Монти Холла (еще раз)

Этот известный парадокс обсуждался, наверное, на каждом более-менее популярном форуме. Вкратце напомню суть:

Вы участвуете в игре. Имеется три закрытых двери, при этом известно, что за одной из этих дверей — приз (например, машина). Имеется ведущий, который знает, за какой именно дверью находится приз. Вам дается право выбрать дверь. После этого, ведущий, которому Вы сообщили о своем выборе, и который знает, где на самом деле находится приз, открывает дверь без приза, и не ту, на которую Вы указали. Осталось две закрытых двери, за одной из которых — приз, и Вам дано право сменить свой первоначальный выбор.

Вопрос: нужно ли менять выбор для того, что бы возросла вероятность выигрыша или же вероятность будет одинакова 50/50 — хоть меняй, хоть нет?

Многие люди ошибочно полагают, что вероятность выигрыша будет одинаковой как в случае смены выбора, так и в случае неизменного решения. Две двери, одна машина — вероятность 50/50.

Конечно, таким товарищам хочется сказать: а что, если игрок выберет дверь и зажмурится, не видя, какую дверь открывает ведущий, или вообще уйдет с игры (ведь он не собирается менять решение!). Неужели вероятность его выигрыша в этом случае будет больше 1/3?
Или если дверей не три, а тысяча, и ведущий после Вашего выбора открывает 998 дверей, неужели не поменяете решение?

Но если Вы знакомы с программированием, то, возможно, разъяснить ситуацию поможет алгоритм моделирования данной игры. Я написал его на PHP, но думаю, идея будет понятна практически всем.

<?

$n = 100; // число опытов

$win_select = 0; // число выигрышей если менять выбор
$win_nonselect = 0; // число выигрышей если НЕ менять выбор

mt_srand(time()+(double)microtime()*1000000); // инициализируем датчик случайных чисел

for ($i=1; $i<=$n; $i++) // Повторяем в цикле опыт n раз { $prize = mt_rand(1,3); // Номер двери за которой машина - случайное число от 1 до 3 $first_select = mt_rand(1,3); // Выбираем дверь. Тоже случайно // *** место для строчки if ($prize == $first_select) // если мы угадали с первого раза { $open_door = mt_rand(1,2); // случайно выбираем одну из двух не выбранных дверей // т.к. оставшихся дверей две, а номера дверей могут быть от 1 до 3, то случайное число сгенерируем // 1 или 2, а если оно совпадет с дверью, за которой приз - то тогда выберем дверь номер 3 if (($open_door == 1) and ($open_door==$prize)) {$open_door=3;} if (($open_door == 2) and ($open_door==$prize)) {$open_door=3;} } if ($prize != $first_select) // если мы НЕ угадали с первого раза { for ($j=1; $j<=3; $j++) // ведущий выбирает для открытия дверь { $open_door = $j; if ( ($open_door != $prize) and ($open_door != $first_select) ) {break;} // которая одновременно и не с призом, и не первая выбранная } } for ($j=1; $j<=3; $j++) // Если мы меняем выбор { $second_select = $j; // То мы выбираем дверь с условием if ( ($second_select != $first_select) and ($second_select != $open_door) ) {break;} // что она одновременно и не открытая ведущим и не первая нами выбранная } if ($second_select==$prize) {$win_select++;} // Если мы угадали сменив выбор if ($first_select==$prize) {$win_nonselect++;} // Если мы угадали не меняя выбор // но посмотрите! ведь эту строку, мы можем поместить на место *** с неизменным результатом! // возня с открыванием двери ничего не решает для случая, если мы не меняем решение! } echo "Total wins select: $win_select
Total wins NONselect: $win_nonselect"; // выводим результаты

?>

В этой программе честно моделируется вся ситуация:

  • 1. За выбранную случайным образом дверь прячем машину (дверь номер prize)
  • 2. Случайно выбираем дверь в роли игрока (дверь номер first_select)
  • 3. Ведущий, зная эти два номера, открывает дверь, номер которой не совпадает ни с номером prize ни с номером first_select. Номер этой открытой двери open_door.
  • 4. Если игрок меняет дверь, то номер новой выбранной двери должен быть не равен ни first_select — первому выбору, ни номеру открытой двери open_door. Номер двери, которую выбрал игрок — second_select
  • 5. Если second_select = prize — значит игрок правильно поменял дверь
  • 6. Если first_seslect = prize — значит игрок бы выиграл, если бы дверь не менял

И вот сейчас главная фишка для понимания парадокса:
Условие проверки в пункте 6 мы можем осуществить сразу после пункта 2!!! Ведь в пунктах 3,4,5 с переменными first_select и prize ничего не происходит! То есть действительно получается, что если мы не меняем выбор, то факты открывания двери — совершенно никак не влияют на вероятность. А она, очевидно, при данном подходе будет равна 1/3.

Запустить скрипт можно кликнув тут.

Если вам понравился материал, пожалуйста, поделитесь им с друзьями: