Симулируйте задачу Монти Холла с помощью Python
Проверьте смоделированные результаты этого загадочного игрового теста, чтобы доказать себе, что действительно стоит изменить свое мнение — иногда.
Если вы ребенок 70-х, возможно, вы выросли на популярном игровом шоу «Давай заключим сделку». С тех пор люди живо обсуждают загадку Монти Холла и с удовольствием ее воспроизводят. Потрясающее напряжение и драма, создаваемые тем, как участник выбирает одну из трех дверей, каждый раз интересно наблюдать.
Используя математику и немного программирования, вы создадите симулятор Монти Холла с использованием Python. Используя это, вы сможете раз и навсегда решить, что смена дверей увеличивает ваши шансы на победу.
В чем проблема Монти Холла?
Задача Монти Холла — это головоломка, названная в честь ведущего игрового шоу Монти Холла. Здесь есть три двери, только в одной из которых находится желанный приз. Как только вы выберете дверь, Монти, который знает, что за ними, открывает другую дверь, показывая козу. Теперь у вас есть возможность придерживаться первоначального решения или перейти к другой двери.
Благодаря своей удивительной и непредсказуемой природе головоломка Монти Холл пользуется большой популярностью. Хотя речь идет о вероятностях, решение не поддается интуиции. Это служит прекрасной демонстрацией того, насколько запутанными могут быть вычисления вероятности. Загадка учит нас игнорировать впечатления от, казалось бы, случайных событий и вместо этого сосредоточиться на рассуждениях и фактах.
Модули Random и Tkinter
Чтобы создать симуляцию Монти Холла на Python, начните с модулей Random и Tkinter.
В модуле Random имеется несколько функций для создания случайных чисел. Вы можете использовать эти алгоритмы для генерации перетасованных последовательностей, игровых движений и псевдослучайных целых чисел. Его часто используют в таких играх, как ручной крикет или простом тесте на набор текста, а также для имитации бросков игральных костей и перетасовки списков.
Tkinter — это библиотека графического интерфейса для Python по умолчанию. Используя его, вы можете создавать фантастические приложения с графическим интерфейсом. Вы можете создать приложение со списком дел, текстовый редактор или простой калькулятор. Вы можете применить свои знания на практике и отточить свои навыки программирования, используя Python и Tkinter для создания базовых настольных приложений.
Откройте терминал и выполните следующую команду, чтобы добавить Tkinter в вашу систему:
pip install tkinter
Как создать симулятор Монти Холла с помощью Python
Вы можете найти исходный код симулятора Монти Холла в этом репозитории GitHub.
Импортируйте модули Random и Tkinter. Функция StringVar упрощает управление значением виджета, такого как метка или запись. Вы можете использовать метку для отображения текста на экране и запись для получения пользовательского ввода.
Инициализируйте экземпляр Tkinter и отобразите корневое окно. Установите размеры окна на 600 пикселей в ширину и 200 пикселей в высоту, используя метод geometry(). Установите соответствующий заголовок окна и запретите его изменение размера.
import random
from tkinter import StringVar, Label, Tk, Entry
window = Tk()
window.geometry("600x200")
window.title("Monty Hall Simulation")
window.resizable(0, 0)
Затем настройте две пары виджетов и переменных для хранения результатов моделирования. Ваше приложение запросит несколько запусков для завершения. Во время каждого запуска он будет моделировать игру и в каждом случае фиксировать результат: решит ли игрок переключиться или сохранит тот же выбор.
Используя StringVar(), установите начальные значения того же выбора и переключенного выбора на 0. Определите виджет «Ввод» и установите для него размер шрифта равный 5. Объявите две метки для отображения одного и того же выбора и переключенного выбора и расположите его. Объявите еще две метки, которые будут отображать значения переменных, которые вы определили ранее. Наконец, разместите виджет «Ввод» под этими четырьмя метками.
same_choice = StringVar()
switched_choice = StringVar()
same_choice.set(0)
switched_choice.set(0)
no_sample = Entry(font=5)
Label(text="Same Choice").place(x=230, y=58)
Label(text="Switched Choice").place(x=230, y=90)
Label(textvariable=same_choice, font=(50)).place(x=350, y=58)
Label(textvariable=switched_choice, font=(50)).place(x=350, y=90)
no_sample.place(x=200, y=120)
Определите функцию, симулируйте. Инициализируйте переменные результата и получите значение выборки, введенное пользователем. Объявите список, содержащий предметы, которые будут открываться за дверью.
В каждом проходе создавайте дубликат списка исходных дверей и перемешивайте его в случайном порядке. Выберите случайную дверь и уберите ее — это имитирует выбор игрока. Затем сымитируйте раскрытие Монти: если в первой двери нет приза, откройте ее, иначе откройте вторую дверь. Удалите этот выбор и оставьте оставшуюся дверь в качестве опции для переключения.
def simulate(event):
same_choice_result = 0
switched_choice_result = 0
samples = int(no_sample.get())
doors = ["gold", "goat", "goat"]
for _ in range(samples):
simulated_doors = doors.copy()
random.shuffle(simulated_doors)
first_choice = random.choice(simulated_doors)
simulated_doors.remove(first_choice)
opened_door = simulated_doors[0] if simulated_doors[0] != "gold" else simulated_doors[1]
simulated_doors.remove(opened_door)
switched_second_choice = simulated_doors[0]
Если первый выбор содержит желаемый приз, увеличьте тот же результат выбора на единицу и отобразите его на экране. В противном случае выполните ту же операцию для переключенного выбора.
if first_choice == "gold":
same_choice_result += 1
same_choice.set(same_choice_result)
elif switched_second_choice == "gold":
switched_choice_result += 1
switched_choice.set(switched_choice_result)
Важным шагом является привязка клавиши Enter к событию в окне Tkinter. Это гарантирует, что когда игрок нажмет Enter, запустится определенная функция. Для этого передайте строку
Функция mainloop() сообщает Python, что нужно запустить цикл событий Tkinter и прослушивать события (например, нажатия кнопок), пока вы не закроете окно.
no_sample.bind("<Return>", simulate)
window.mainloop()
Соберите все это вместе и запустите программу, чтобы смоделировать головоломку в действии.
Вывод симулятора Монти Холла с использованием Python
При запуске программы вы увидите простое окно с метками выбора «То же самое» и «Переключено». Введите номер образца в поле внизу, чтобы просмотреть смоделированные результаты. В этом примере из трех запусков программа показывает, что она выиграла один раз с одним и тем же выбором и дважды с переключением.
Эти результаты являются случайными, но вы можете запустить моделирование с большим размером выборки для большей точности. В следующем размере выборки, равном 100, выбранный вариант выигрывает 65 раз.
Решение проблем с использованием программирования
Симулятор Монти Холла — отличная демонстрация того, как можно использовать программирование для решения реальных задач. Вы можете разрабатывать различные алгоритмы и обучать модели для выполнения конкретных задач, таких как сортировка массива или повышение эффективности системы для оптимального производства.
Различные языки программирования предлагают разные возможности и функции, упрощающие программирование. Используя Python, вы можете создавать модели, которые могут прогнозировать будущие значения набора данных с более высокой точностью. Кроме того, вы можете автоматизировать повторяющиеся операции, уменьшить скучную работу и повысить скорость и точность.