Про парадокс Монти Холла | Блог python программиста
Изображение гика

Блог питониста

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

25 апреля 2019 г.

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

Проблема описывается так: есть три двери, за одной из них автомобиль, за двумя другими - козлы. И мы не знаем где что находится, нам надо угадать, где автомобиль:

18_1.jpeg

И мы случайным образом выбираем какую-то дверь в первый раз, например первую:

18_2.jpeg

После этого ведущий, который в отличие от нас знает где что расположено, открывает какую-нибудь из невыбранных нами дверей с козлом (в данном случае ему остаётся открыть вторую дверь):

18_3.jpeg

И затем ведущий нас спрашивает о том, будем ли мы менять свой выбор. То есть в данном случае спрашивает о том, оставляем ли мы выбранной первую дверь или меняем решение, выбирая третью. Чтобы ответить на этот вопрос, надо понять в каком случае вероятность выиграть больше. Есть два варианта развития событий:

  1. Не меням первоначальный выбор
  2. Меняем первоначальный выбор

Очевидно, что если не менять свое решение, то вероятность выиграть - это вероятность выбрать один автомобиль из трех вариантов:

$$P\left\{ выиграть,\spaceне\spaceменяя\spaceвыбор\right\} = \frac{1}{3}$$

Если же мы меняем свой выбор, то мы выиграем только в том случае, если с первой попытки выбрали козла. Выбрать козла можно двумя способами из трех. То есть в этом случае мы выиграем с вероятностью:

$$P\left\{ выиграть,\spaceменяя\spaceвыбор\right\} = \frac{2}{3}$$

Теперь проверим это, используя python:

 1# -*- coding: utf-8 -*-
 2import random
 3
 4
 5def monty_hall_without_change(choices):
 6    # в начале каждой попытки случайно перемешаем массив
 7    random.shuffle(choices)
 8    return choices[random.randrange(len(choices))]
 9
10
11def monty_hall_with_change(choices):
12    # в начале каждой попытки случайно перемешаем массив
13    random.shuffle(choices)
14    # первый выбор
15    first_choice = random.randrange(len(choices))
16    # ведущий открывает дверь с козлом
17    for i in range(len(choices)):
18        if i != first_choice and choices[i] == 'к':
19            host_choice = i
20            break
21    # делаем второй выбор, меняя первое решение
22    for i in range(len(choices)):
23        if i != first_choice and i != host_choice:
24            return choices[i]
25
26
27# к - козел, а - автомобиль
28choices = ['к', 'к', 'а']
29# просто калое-либо большое число (количество опытов)
30N = 100000
31
32# проверяем вариант с неизменным выбором
33win_count = 0
34for _ in range(N):
35    result = monty_hall_without_change(choices)
36    if result == 'а':
37        win_count += 1
38# вероятность выиграть - частота выигранных опытов
39print(win_count/N)
40
41# проверяем вариант с изменением выбора
42win_count = 0
43for _ in range(N):
44    result = monty_hall_with_change(choices)
45    if result == 'а':
46        win_count += 1
47# вероятность выиграть - частота выигранных опытов
48print(win_count/N)

И этот скрипт даст следующий результат:

alexey@vostro:~/projects/blog_materials$ python3 monty_hall.py 
0.33136
0.6671

Что совпадает с теоретическими соображениями. Если вам когда-либо доведется участвовать в подобной викторине, то меняйте свой выбор, ведь вы тогда в 2 раза увеличите вероятность выиграть приз.

Если вам понравился пост, можете поделиться им в соцсетях: