نتایج شبیهسازیشده از این تست بازیهای گیجکننده را بررسی کنید تا به خودتان ثابت کنید که واقعاً برای تغییر عقیدهتان – گاهی اوقات، به صرفه است.
اگر شما یک بچه دهه ۷۰ هستید، ممکن است با تماشای نمایش بازی محبوب، بیایید معامله کنیم، بزرگ شده باشید. از آن زمان، مردم به طور واضح در مورد پازل مونتی هال بحث می کنند و از تکرار آن لذت می برند. تعلیق و درام حیرتانگیز که هنگام انتخاب یکی از سه در ایجاد میشود، تماشای هر بار سرگرمکننده است.
با استفاده از ریاضی و کمی برنامه نویسی، می خواهید شبیه ساز مونتی هال را با استفاده از پایتون بسازید. با استفاده از این، می توانید یک بار برای همیشه تصمیم بگیرید که تعویض درها شانس شما را برای برنده شدن افزایش می دهد.
مشکل مونتی هال چیست؟
مشکل مونتی هال یک بازی فکری است که به نام مونتی هال، مجری نمایش بازی، نامگذاری شده است. سه در وجود دارد که فقط یکی از آنها دارای جایزه مورد نظر است. هنگامی که دری را انتخاب می کنید، مونتی – که می داند پشت آنها چیست – در دیگری را باز می کند و یک بز را آشکار می کند. اکنون این گزینه را دارید که به تصمیم اصلی خود پایبند باشید یا به درب دیگر بروید.
پازل مونتی هال به دلیل ماهیت غافلگیرکننده و غیرقابل پیش بینی آن بسیار محبوب است. اگرچه با احتمالات سر و کار دارد، اما راه حل با شهود مخالفت می کند. این به عنوان یک نمایش عالی از اینکه محاسبات احتمال چقدر می تواند گیج کننده باشد عمل می کند. این پازل به ما می آموزد که چگونه تصورات اتفاقات به ظاهر تصادفی را نادیده بگیریم و در عوض روی استدلال و حقایق تمرکز کنیم.
ماژول های تصادفی و Tkinter
برای ساخت شبیه سازی مونتی هال در پایتون، با ماژول های Random و Tkinter شروع کنید.
چندین تابع برای تولید اعداد تصادفی در ماژول Random وجود دارد. شما می توانید از این الگوریتم ها برای تولید توالی های به هم ریخته، حرکات بازی و اعداد صحیح شبه تصادفی استفاده کنید. اغلب در بازی هایی مانند کریکت دستی، یا یک تست تایپ ساده، و همچنین برای شبیه سازی تاس و به هم زدن لیست ها استفاده می شود.
Tkinter کتابخانه رابط کاربری گرافیکی پیش فرض پایتون است. با استفاده از آن می توانید برنامه های گرافیکی فوق العاده ای بسازید. ممکن است یک برنامه فهرست کارها، ویرایشگر متن یا ماشین حساب ساده ایجاد کنید. شما می توانید دانش خود را در عمل به کار ببندید و مهارت های برنامه نویسی خود را با استفاده از Python و Tkinter برای ساخت برنامه های دسکتاپ اولیه تقویت کنید.
یک ترمینال را باز کنید و دستور زیر را برای اضافه کردن Tkinter به سیستم خود اجرا کنید:
pip install tkinter
نحوه ساخت شبیه ساز مونتی هال با استفاده از پایتون
شما می توانید کد منبع شبیه ساز مونتی هال را در اینجا پیدا کنید
مخزن GitHub
.
ماژول های تصادفی و Tkinter را وارد کنید. تابع StringVar کنترل مقدار یک ویجت مانند Label یا Entry را آسان تر می کند. می توانید از یک برچسب برای نمایش متن روی صفحه و از یک ورودی برای واکشی ورودی کاربر استفاده کنید.
نمونه Tkinter را راه اندازی کنید و پنجره ریشه را نمایش دهید. با استفاده از روش geometry() ابعاد پنجره را به عرض 600 پیکسل و ارتفاع 200 پیکسل تنظیم کنید. یک عنوان پنجره مناسب تنظیم کنید و تغییر اندازه آن را ممنوع کنید.
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 تنظیم کنید. ویجت Entry را تعریف کنید و اندازه فونت آن را روی 5 تنظیم کنید. دو برچسب را برای نمایش همان و انتخاب سوئیچ شده اعلام کنید و آن را قرار دهید. دو برچسب دیگر را اعلام کنید که مقدار متغیرهایی را که قبلاً تعریف کرده اید نشان می دهد. در نهایت، ویجت Entry را در زیر این چهار برچسب قرار دهید.
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() به پایتون می گوید که حلقه رویداد Tkinter را اجرا کند و به رویدادها (مانند فشار دادن دکمه) گوش دهد تا زمانی که پنجره را ببندید.
no_sample.bind("<Return>", simulate)
window.mainloop()
همه را کنار هم بگذارید و برنامه خود را اجرا کنید تا پازل را در عمل شبیه سازی کنید.
خروجی شبیه ساز مونتی هال با استفاده از پایتون
در اجرای برنامه، یک پنجره ساده با برچسب های Same و Switched انتخاب خواهید کرد. برای مشاهده نتایج شبیه سازی شده، یک عدد نمونه را در قسمت پایین وارد کنید. در این نمونه از 3 اجرا، برنامه یک بار با همان انتخاب و دو بار با یک سوئیچ برنده را نشان می دهد.
این نتایج تصادفی هستند، اما برای دقت بیشتر می توانید شبیه سازی را با حجم نمونه بیشتر اجرا کنید. در حجم نمونه 100 نفری زیر، انتخاب تغییر یافته 65 بار برنده می شود.
حل مسائل با استفاده از برنامه نویسی
شبیه ساز مونتی هال نمایشی عالی از نحوه استفاده از برنامه نویسی برای حل مشکلات زندگی واقعی است. شما می توانید الگوریتم های مختلف و مدل های آموزش را برای انجام وظایف خاص مانند مرتب سازی یک آرایه یا بهبود اثربخشی یک سیستم برای تولید بهینه توسعه دهید.
زبان های برنامه نویسی مختلف قابلیت ها و عملکردهای متفاوتی را برای تسهیل برنامه نویسی ارائه می دهند. با استفاده از پایتون، می توانید مدل هایی ایجاد کنید که می توانند مقادیر آینده یک مجموعه داده را با دقت بالاتر پیش بینی کنند. علاوه بر این، می توانید عملیات تکراری را خودکار کنید، کار خسته کننده را کاهش دهید و سرعت و دقت را بهبود بخشید.