Про парадокс Монти Холла
В теории вероятностей есть забавный парадокс - парадокс Монти Холла. В этом посте хочу немного с ним разобраться, потому что с первого взгляда он кажется странным и контринтуитивным, поэтому и считается парадоксом. Хотя, по сути, эта задача - не парадокс, потому что не имеет противоречия.
Проблема описывается так: есть три двери, за одной из них автомобиль, за двумя другими - козлы. И мы не знаем где что находится, нам надо угадать, где автомобиль:
И мы случайным образом выбираем какую-то дверь в первый раз, например первую:
После этого ведущий, который в отличие от нас знает где что расположено, открывает какую-нибудь из невыбранных нами дверей с козлом (в данном случае ему остаётся открыть вторую дверь):
И затем ведущий нас спрашивает о том, будем ли мы менять свой выбор. То есть в данном случае спрашивает о том, оставляем ли мы выбранной первую дверь или меняем решение, выбирая третью. Чтобы ответить на этот вопрос, надо понять в каком случае вероятность выиграть больше. Есть два варианта развития событий:
- Не меням первоначальный выбор
- Меняем первоначальный выбор
Очевидно, что если не менять свое решение, то вероятность выиграть - это вероятность выбрать один автомобиль из трех вариантов:
$$P\left\{ выиграть,\spaceне\spaceменяя\spaceвыбор\right\} = \frac{1}{3}$$
Если же мы меняем свой выбор, то мы выиграем только в том случае, если с первой попытки выбрали козла. Выбрать козла можно двумя способами из трех. То есть в этом случае мы выиграем с вероятностью:
$$P\left\{ выиграть,\spaceменяя\spaceвыбор\right\} = \frac{2}{3}$$
Теперь проверим это, используя python:
1 # -*- coding: utf-8 -*- 2 import random 3 4 5 def monty_hall_without_change(choices): 6 # в начале каждой попытки случайно перемешаем массив 7 random.shuffle(choices) 8 return choices[random.randrange(len(choices))] 9 10 11 def 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 # к - козел, а - автомобиль 28 choices = ['к', 'к', 'а'] 29 # просто калое-либо большое число (количество опытов) 30 N = 100000 31 32 # проверяем вариант с неизменным выбором 33 win_count = 0 34 for _ in range(N): 35 result = monty_hall_without_change(choices) 36 if result == 'а': 37 win_count += 1 38 # вероятность выиграть - частота выигранных опытов 39 print(win_count/N) 40 41 # проверяем вариант с изменением выбора 42 win_count = 0 43 for _ in range(N): 44 result = monty_hall_with_change(choices) 45 if result == 'а': 46 win_count += 1 47 # вероятность выиграть - частота выигранных опытов 48 print(win_count/N)
И этот скрипт даст следующий результат:
alexey@vostro:~/projects/blog_materials$ python3 monty_hall.py 0.33136 0.6671
Что совпадает с теоретическими соображениями. Если вам когда-либо доведется участвовать в подобной викторине, то меняйте свой выбор, ведь вы тогда в 2 раза увеличите вероятность выиграть приз.