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