#теория_вероятностей
Приветствую! Не могу понять смысл проблемы Монти Холла. Решил провести эксперимент и опытным путем определить соотношение победителей/проигравших. Вот сам скрипт. Вопрос: Кто может на пальцах объяснить, что я делаю не так? Почему результаты моей симуляции расходятся с теми, о которых говорится в статье? Развернутый вопрос. Сделал такой класс: 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 , +/-число циклов и т.п.) думаю, разберетесь...
Комментариев нет:
Отправить комментарий