Skip to main content

Задача Монти Холла

Статья на хабре http://habrahabr.ru/blogs/arbeit/101695/ побудила меня проверить, действительно ли это так.

Суть проблемы Монти Холла

В телевикторине участники должны выбрать одну из трех дверей. За одной дверью находится машина, за двумя другими нет ничего. Участник, выбирает дверь, а ведущий, которому известно, что находится за каждой из дверей, открывает одну из оставшихся, конечно пустышку. Затем он говорит участнику, — «Вы смените дверь или выберете другую?». Вопрос, который мы рассмотрим в том, выгодно ли участнику сменить дверь или выгодно оставить свой выбор.

Правильный ответ: надо сменить дверь, тогда вероятность выигрыша вырастет в два раза.

Я написал небольшой php код, чтобы проверить это. Действительно вероятность выигрыша растет в два раза, как это ни странно.

Вот результаты работы скрипта

Win choosen probability = 0.33504
Win rechoosen probability = 0.66496

Вот код:

<?php

$tests = 100000;// число испытаний

mt_srand(make_seed());
$wins_choosen = 0; // число выигрышей с первым выбором двери
$wins_rechoosen = 0; // число выигрышей с выбором второй двери
for ($i = 0; $i < $tests; $i++) {
    $win_number = mt_rand(1,3);
    $choosen_number = mt_rand(1,3);
    $rechoosen_number = rechoosen_number($win_number, $choosen_number);
    if ($win_number == $choosen_number) {
        $wins_choosen++;
    }
    if ($win_number == $rechoosen_number) {
        $wins_rechoosen++;
    }    

}

echo "Win choosen probability = ".($wins_choosen / $tests)."\n";
echo "Win rechoosen probability = ".($wins_rechoosen / $tests)."\n";

//-------------------
// выбор другой двери
function rechoosen_number($win_number, $choosen_number) {
    $all = array(1,2,3);
    if ($win_number == $choosen_number) {
        $opened_number_arr = array_diff($all, array($win_number));
        $opened_number_arr = explode(',', join(',', $opened_number_arr));
        $opened_number = $opened_number_arr[mt_rand(0,1)];
    } else {
        $opened_number_arr = array_diff($all, array($win_number, $choosen_number));
        $opened_number_arr = explode(',', join(',', $opened_number_arr));
        $opened_number = $opened_number_arr[0];
    }

    $rechoose_arr = array_diff($all, array($choosen_number, $opened_number));
    $rechoose_arr = explode(',', join(',', $rechoose_arr));
    return $rechoose_arr[0];
}

function make_seed()
{
  list($usec, $sec) = explode(' ', microtime());
  return (float) $sec + ((float) $usec * 100000);
}

Но я так пока и не понял почему.

P.S.
Подумав пол ночи, я даже понял, почему удваивается вероятность выигрыша.
Итак если мы выбираем одну комнату и не меняем ее, то вероятность 1/3, то есть в одной из трех комнат есть приз.
Если мы меняем комнату, то может быть два варианта
1) мы сначала угадали правильную комнату и потом поменяли ее — вероятность этого как и раньше 1/3
2) мы сначала угадали не правильную комнату и потом поменяли ее — вероятность этого как и раньше 2/3, но в результате мы выигрываем, а не проигрываем как при простом выборе.

То есть при смене комнаты вам для выигрыша надо угадать неправильную комнату, а вероятность этого в два раза больше.

Потому что при изменении

Потому что при изменении двери, получается новая задача с новыми исходными данными, третья дверь выбрасывается... и уже вероятность не 1/3, а 1/2.
Если не менять дверь, то так и останетесь со своими 1/3, а тут получается прирост вероятности... на целых 3/2! Если я не ошибся в расчетах, т.е. желательно изменить свое решение, и уже играть с новой задачей, с новыми условиями, с большей вероятностью...
Кстати, можно пойти другим путём, рассмотреть вероятность проигрыша, в том и в другом случае, будет видно, что там он как раз 2/3, а тут всего 1/2... он вероятностно меньше!!!

вероятность выигрыша становится 2/3

а у вас она вроде 1/2 ?

вот)

потому что при изменении двери, получается новая задача с новыми исходными данными, третья дверь выбрасывается... и уже вероятность не 1/3, а 1/2.
Если не менять дверь, то так и останетесь со своими 1/3, а тут получается прирост вероятности... на целых 3/2! Если я не ошибся в расчетах, т.е. желательно изменить свое решение, и уже играть с новой задачей, с новыми условиями, с большей вероятностью...
Кстати, можно пойти другим путём, рассмотреть вероятность проигрыша, в том и в другом случае, будет видно, что там он как раз 2/3, а тут всего 1/2... он вероятностно меньше!!!

Все просто!

Я тоже написал код для проверки этой задачи.
И когда писал всё стало очевидно!
В Вашем коде все, что ниже 23 строки лишнее!

Если оставить суть, то код сведется к следующему:

$tests = 100000;// число испытаний
$wins_choosen = 0; // число выигрышей с первым выбором двери
$wins_rechoosen = 0; // число выигрышей с выбором второй двери
for ($i = 0; $i < $tests; $i++) {
    $win_number = mt_rand(1,3);
    $choosen_number = mt_rand(1,3);
    if ($win_number == $choosen_number) {
        $wins_choosen++;
    } else { // других-то вариантов быть не может, поэтому $rechoosen_number не нужен
        $wins_rechoosen++;
    }   
}
echo "Win choosen probability = ".($wins_choosen / $tests)."\n";
echo "Win rechoosen probability = ".($wins_rechoosen / $tests)."\n";

Очевидно, вероятность первого варианта =1/3, второго =2/3

здорово

пока не понял, можно ли так делать
но если да, то код намного упрощается
я очень здорово помучался с rechoosen

В общем, чтобы так делать, надо хорошо понимать эту задачу, и сам код вообще не нужен. Пока разбираешься с задачей не очевидно, то что вы написали.

)))

"Задача Монти Холла" - это задача-шутка.
В ней содержится всего лишь одна ошибка в постановке задачи, хорошо замаскированная ошибка, вот она и искажает решение так что человек в большинстве случаев использует неверный способ ее решения.

Дело в том что теория вероятности не работает с уже выясненными обстоятельствами; т.е. когда ведущий открывает одну дверь - условия задачи меняются.
Другими словами: в начале имеется одна задача, а после того как дверь открыта - имеется уже другая задача. Она однотипная - но другая.
Продолжая решать первую задачу человек неминуемо приходит к выводу что выгоднее сменить дверь.
Но это ошибка.
Верный ответ: 50/50, т.е. - с точки зрения теории вероятности - пофиг сменит человек дверь или нет.

Другое дело что телешоу - это не совсем чистая вероятность, т.к. ведущий знает где машина и тонко направляет игрока: рейтинги то поднимать надо; но это уже за пределами теории вероятности.

А с т.з. именно теории вероятности как только дверь открыта надо составлять задачу заново и решать заново.

тогда вероятность должна быть 1/2

а она 2/3

)))

Верный ответ - 1/2.

2/3 - это ответ не на задачу Монти холла а на задачу, котрая очень похожа, но не учитывает переход от ситуации "3 неизвестные двери" к "2 неизвестные двери".

Поясню:
есть 3 двери, че за ними неизвестно. Выбор двери. Открывается одна дверь (одна из невыбранных).

Вот тут момент подлова решающего!

Тут надо остановиться и все предыдущие рассуждения просто вычеркнуть. Поскольку сменилась область неопределнности.
И вот тут начинается другая задача: 2 двери, неизвестно что за ними. Одна из них изначально выбрана игроком - но это без разницы для теор.вера. Т.е. по факту 2 двери, никаких дополнительных условий.
Ответ - 1/2.

увы

результаты численного эксперимента, что я провел выше, дают результат 2/3

Там же в комментариях

Там же в комментариях написано, почему: http://habrahabr.ru/blogs/arbeit/101695/#comment_3153975

точно

приятно что я это сам понял