Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

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

#теория_вероятностей


Приветствую!
Не могу понять смысл проблемы Монти Холла. Решил провести эксперимент и опытным путем
определить соотношение победителей/проигравших. Вот сам скрипт.
Вопрос: Кто может на пальцах объяснить, что я делаю не так? Почему результаты моей
симуляции расходятся с теми, о которых говорится в статье?
Развернутый вопрос. Сделал такой класс:
function MontyHallState()
    {
    // Изначально все 3 двери — закрыты:
    this.doors = [0, 0, 0];
    this.doorsOpened = 0;

    // За одной из дверей есть приз:
    this.prize = Math.floor(Math.random() * 3);

    // Игрок выбрал одну из дверей:
    this.choice = Math.floor(Math.random() * 3);

    this.openDoor = function()
        {
        /*
        Если осталось закрытыми меньше 3 дверей,
        то ф-ция возвращает false, иначе —
        «открывается» случайная дверь, за которой нет приза, при этом
        не та, которую выбрал игрок —
        должны быть удовлетворены условия:
        this.doors[openDoor] === 0
        и
        openDoor !== this.choice
        */
        }

    this.changeChoice = function()
        {
        /*
        Значение this.choice должно поменяться таким образом, что
        новое значение должно отличаться от текущего, при этом
        не должно указывать на уже открытую дверь —
        должно быть удовлетворено условие
        this.doors[this.choice] === 0
        */
        };
    }

Алгоритм симуляции:


Для тех, кто хочет менять первоначальный выбор:
a. Создаем экземпляр объекта (выбор двери сделан)
b. Открываем дверь, за которой точно нет приза
c. Меняем выбор


Для тех, кто уверен в первоначальном выборе:
a. Создаем экземпляр объекта (выбор двери сделан)
b. Открываем дверь, за которой точно нет приза


Сравниваем значения членов prize и choice. Если значения совпадают — приз получен.
Проделаем этим манипуляции по 10000 раз для обоих вариантов поведения (еще раз —
скрипт). Я увидел следующие результаты:

Don't change choice
Winners: 3408
Losers: 6592

Change choice
Winners: 3345
Losers: 6655

Как видим, процент успеха для обоих случаев примерно одинаковый — ≈33%. Если Повторить
опыт несколько раз, убедимся, что такой исход является обыкновением в этой ситуации.
Если рассматривать модель, при которой есть не 3, а 4 двери, окажется, что процент
успеха будет составлять ≈25%.
Если опыт проведен верно, то можно ли Парадокс Монти Холла считать несостоятельным?
Если опыт проведен неверно или сделаны не те выводы, то какие именно?
Спасибо.    


Ответы

Ответ 1



Опыт проведён не верно. Чтобы получить вероятность 2/3 из Парадокса Монти-Холла, необходимо всегда менять выбор, когда ведущий просит выбрать дверь во второй раз. Из статьи: если вы меняете дверь после действий ведущего, то вы выигрываете, если изначально выбрали проигрышную дверь (тогда ведущий откроет вторую проигрышную и вам останется поменять свой выбор чтобы победить). А изначально выбрать проигрышную дверь можно 2 способами (вероятность 2⁄3), то есть если вы меняете дверь, вы выигрываете с вероятностью 2⁄3. Для случае 4 и более дверей, ведущий открывает все двери с козами кроме одной двери (плюс ещё остаётся дверь с машиной). Одна из оставшихся дверей была выбрана игроком изначально. вероятность что игрок выбрал изначально дверь с машиной равна 1/4 то есть вероятность что игрок выбрал изначально дверь с козой равна 3/4 остались две двери (за одной из них машина): одну из них изначально выбрал игрок. Если за ней коза (вероятность 3/4), то при смене двери игрок находит машину. Чтобы прочувствовать решение, можно рассмотреть 1000 дверей: если представить что дверей не 3 а, скажем 1000, и после выбора игрока ведущий убирает 998 лишних, оставляя 2 двери: ту которую выбрал игрок и еще одну. Очевидно, что вероятность нахождения приза за каждой из них вовсе не ½. Гораздо большая вероятность его нахождения, а именно 0.999, будет иметь место при смене решения и выборе двери отобранной из 999. В случае с 3 дверьми логика сохраняется, но вероятность выигрыша при смене решения ниже, а именно 2⁄3. Симуляция на Питоне, подтверждает теорию: #!/usr/bin/env python import random CAR, GOAT = 'car', 'goat' DOORS = [CAR] + [GOAT]*2 win_keep = win_change = 0 for round in range(1, 10001): doors = list(DOORS) # make the first choice random.shuffle(doors) win_keep += (doors.pop() == CAR) # remove all but one door while len(doors) > 1: doors.remove(GOAT) # change the choice win_change += (doors[0] == CAR) print("{:.1%} {:.1%}".format(float(win_keep)/round, float(win_change)/round)) Вывод 33.7% 66.3% То есть 1/3 если не менять дверь и 2/3 если менять. Чтобы провести тесты для 4 дверей достаточно кол-во коз изменить в определении DOORS.

Ответ 2



@Bars, в комментарий не влезает, поэтому пример программы моделирования в виде ответа. #include #include #include #include int main (int ac, char *av[]) { int m = 3; if (av[1] && strcmp(av[1], "-d") == 0) { m = 1000; av++; if (av[1]) { m = atoi(av[1]); av++; } if (m < 3) m = 3; } int i, n = atoi(av[1] ? av[1] : "10000001"), nw1 = 0, nw2 = 0; if (n < 1) { srand(time(0)); n = -n; } else if (!n) n = 10; // n rounds simulation for m doors for (i = 0; i < n; i++) { int choice, car, door[m]; memset(door, 0, sizeof(door[0]) * m); door[car = (rand() % m)] = 1; // car // alg 1 -- first choice nw1 += door[choice = (rand() % m)]; // alg 2 -- change door if (car != choice) nw2++; } printf ("%d doors win simulations %d: no change -- %.2f%% change -- %.2f%%\n", m, n, (nw1 * 100.0) / n, (nw2 * 100.0) / n); } Компилировать gcc или g++, с аргументами (-d , +/-число циклов и т.п.) думаю, разберетесь...

Комментариев нет:

Отправить комментарий