Εάν είστε παιδί της δεκαετίας του '70, μπορεί να έχετε μεγαλώσει παρακολουθώντας τη δημοφιλή εκπομπή παιχνιδιών, Let's Make a Deal. Από τότε, οι άνθρωποι συζητούν έντονα το παζλ του Monty Hall και διασκεδάζουν αναπαράγοντας το. Το συγκλονιστικό σασπένς και το δράμα που δημιουργείται καθώς ο διαγωνιζόμενος επιλέγει μία από τις τρεις πόρτες είναι διασκεδαστικό να το βλέπεις κάθε φορά.
Χρησιμοποιώντας μαθηματικά και λίγο προγραμματισμό, πρόκειται να δημιουργήσετε έναν προσομοιωτή Monty Hall χρησιμοποιώντας Python. Χρησιμοποιώντας αυτό, θα μπορείτε να αποφασίσετε μια για πάντα ότι η αλλαγή των θυρών αυξάνει τις πιθανότητές σας να κερδίσετε.
Ποιο είναι το πρόβλημα του Monty Hall;
Το πρόβλημα του Monty Hall είναι ένα τρέιλερ που πήρε το όνομά του από τον παρουσιαστή των παιχνιδιών Monty Hall. Υπάρχουν τρεις πόρτες, εκ των οποίων μόνο η μία περιέχει το επιθυμητό έπαθλο. Μόλις επιλέξετε μια πόρτα, ο Μόντι —ποιος ξέρει τι κρύβεται πίσω τους— ανοίγει μια άλλη πόρτα, αποκαλύπτοντας μια κατσίκα. Τώρα έχετε την επιλογή να παραμείνετε στην αρχική σας απόφαση ή να μεταβείτε στην άλλη πόρτα.
Λόγω της εκπληκτικής και απρόβλεπτης φύσης του, το παζλ Monty Hall είναι πολύ δημοφιλές. Αν και ασχολείται με πιθανότητες, η λύση αψηφά τη διαίσθηση. Χρησιμεύει ως μια εξαιρετική απόδειξη του πόσο μπερδεμένοι μπορεί να είναι οι υπολογισμοί πιθανοτήτων. Το παζλ μας διδάσκει πώς να αγνοούμε τις εντυπώσεις φαινομενικά τυχαίων συμβάντων και αντ' αυτού να επικεντρωνόμαστε στη λογική και τα γεγονότα.
Οι Ενότητες Random και Tkinter
Για να δημιουργήσετε μια προσομοίωση Monty Hall στην Python, ξεκινήστε με τις ενότητες Random και Tkinter.
Υπάρχουν πολλές λειτουργίες για την παραγωγή τυχαίων αριθμών στη μονάδα Random. Μπορείτε να χρησιμοποιήσετε αυτούς τους αλγόριθμους για να δημιουργήσετε ανακατεμένες ακολουθίες, κινήσεις παιχνιδιού και ψευδοτυχαίους ακέραιους αριθμούς. Χρησιμοποιείται συχνά σε παιχνίδια όπως το κρίκετ στο χέρι, ή ένα απλό τεστ δακτυλογράφησης, καθώς και για προσομοίωση ζαριάς και ανακατεύθυνση λιστών.
Το Tkinter είναι η προεπιλεγμένη βιβλιοθήκη GUI για την Python. Χρησιμοποιώντας το, μπορείτε να δημιουργήσετε φανταστικές εφαρμογές GUI. Μπορείτε να δημιουργήσετε μια εφαρμογή λίστας υποχρεώσεων, πρόγραμμα επεξεργασίας κειμένου ή απλή αριθμομηχανή. Μπορείτε να εφαρμόσετε τις γνώσεις σας στην πράξη και να βελτιώσετε τις προγραμματιστικές σας δεξιότητες χρησιμοποιώντας Python και Tkinter για την κατασκευή βασικών εφαρμογών επιφάνειας εργασίας.
Ανοίξτε ένα τερματικό και εκτελέστε την ακόλουθη εντολή για να προσθέσετε το Tkinter στο σύστημά σας:
pip εγκατάσταση tkinter
Πώς να φτιάξετε έναν προσομοιωτή Monty Hall χρησιμοποιώντας Python
Μπορείτε να βρείτε τον πηγαίο κώδικα του προσομοιωτή Monty Hall σε αυτό Αποθετήριο GitHub.
Εισαγάγετε τις μονάδες τυχαίας και Tkinter. Η συνάρτηση StringVar διευκολύνει τον έλεγχο της τιμής ενός γραφικού στοιχείου όπως μια ετικέτα ή μια καταχώριση. Μπορείτε να χρησιμοποιήσετε μια Ετικέτα για να εμφανίσετε κάποιο κείμενο στην οθόνη και μια Καταχώριση για να λάβετε τα δεδομένα χρήστη.
Αρχικοποιήστε την παρουσία Tkinter και εμφανίστε το ριζικό παράθυρο. Ορίστε τις διαστάσεις του παραθύρου να είναι 600 pixel πλάτος και 200 pixel ύψος χρησιμοποιώντας το γεωμετρία() μέθοδος. Ορίστε έναν κατάλληλο τίτλο παραθύρου και απαγορεύστε την αλλαγή του μεγέθους του.
εισαγωγή τυχαίος
από tkinter εισαγωγή StringVar, Label, Tk, Entry
παράθυρο = Tk()
window.geometry("600x200")
window.title("Monty Hall Simulation")
window.resizable(0, 0)
Στη συνέχεια, ρυθμίστε δύο ζεύγη γραφικών στοιχείων και μεταβλητών για να αποθηκεύσετε τα αποτελέσματα της προσομοίωσης. Η εφαρμογή σας θα ζητήσει να ολοκληρωθεί ένας αριθμός εκτελέσεων. Κατά τη διάρκεια κάθε τρεξίματος, θα προσομοιώνει το παιχνίδι και θα καταγράφει το αποτέλεσμα σε κάθε περίπτωση: εάν ο παίκτης αποφασίσει να αλλάξει ή να διατηρήσει την ίδια επιλογή.
Χρησιμοποιώντας το StringVar(), ορίστε τις αρχικές τιμές της ίδιας επιλογής και αλλάξτε την επιλογή στο 0. Ορίστε ένα γραφικό στοιχείο Καταχώρισης και ορίστε το μέγεθος της γραμματοσειράς του σε 5. Δηλώστε δύο ετικέτες για να εμφανίσετε την ίδια και την αλλαγή επιλογής και τοποθετήστε την. Δηλώστε δύο ακόμη ετικέτες που θα εμφανίζουν την τιμή των μεταβλητών που καθορίσατε νωρίτερα. Τέλος, τοποθετήστε το γραφικό στοιχείο Entry κάτω από αυτές τις τέσσερις ετικέτες.
same_choice = StringVar()
switched_choice = StringVar()
same_choice.set(0)
switched_choice.set(0)
no_sample = Καταχώριση (font=5)
Ετικέτα (κείμενο="Ίδια επιλογή").τόπος (x=230, y=58)
Ετικέτα (κείμενο="Αλλαγή επιλογής").τόπος (x=230, y=90)
Ετικέτα (textvariable=same_choice, font=(50)).τόπος (x=350, y=58)
Ετικέτα (textvariable=switched_choice, font=(50)).τόπος (x=350, y=90)
no_sample.place (x=200, y=120)
Ορίστε μια συνάρτηση, προσποιούμαι. Αρχικοποιήστε τις μεταβλητές αποτελέσματος και λάβετε την τιμή δείγματος που έχει εισαχθεί από τον χρήστη. Δηλώστε μια λίστα που περιέχει τα αντικείμενα που θα αποκαλύψουν οι πόρτες.
Σε κάθε εκτέλεση, δημιουργήστε μια διπλή λίστα με τις αρχικές πόρτες και ανακατέψτε την με τυχαία σειρά. Επιλέξτε μια τυχαία πόρτα και αφαιρέστε την—αυτό προσομοιώνει την επιλογή του παίκτη. Στη συνέχεια, προσομοιώστε την αποκάλυψη του Monty: αν η πρώτη πόρτα δεν περιέχει το βραβείο, ανοίξτε την, διαφορετικά ανοίξτε τη δεύτερη πόρτα. Αφαιρέστε αυτήν την επιλογή και αφήστε την υπόλοιπη πόρτα ως επιλογή για εναλλαγή.
defπροσποιούμαι(Εκδήλωση):
same_choice_result = 0
switched_choice_result = 0
δείγματα = int (no_sample.get())
πόρτες = ["χρυσός", "γίδα", "γίδα"]
Για _ σε εύρος (δείγματα):
simulated_doors = doors.copy()
random.shuffle (simulated_doors)
first_choice = random.choice (simulated_doors)
simulated_doors.remove (first_choice)
open_door = προσομοιωμένες_πόρτες[0] αν προσομοιωμένες_πόρτες[0] != "χρυσός"αλλού προσομοιωμένες_πόρτες[1]
simulated_doors.remove (opened_door)
switched_second_choice = simulated_doors[0]
Εάν η πρώτη επιλογή περιέχει το επιθυμητό έπαθλο, αυξήστε το ίδιο αποτέλεσμα επιλογής κατά ένα και απεικονίστε το στην οθόνη. Διαφορετικά, εκτελέστε την ίδια λειτουργία για την επιλογή μεταγωγής.
αν πρώτη_επιλογή == "χρυσός":
same_choice_result += 1
same_choice.set (same_choice_result)
ελιφ switched_second_choice == "χρυσός":
switched_choice_result += 1
switched_choice.set (switched_choice_result)
Ένα σημαντικό βήμα είναι να συνδέσετε το κλειδί Enter με ένα συμβάν στο παράθυρο Tkinter. Με αυτόν τον τρόπο διασφαλίζεται ότι όταν η συσκευή αναπαραγωγής πατάει Εισαγω, θα εκτελεστεί μια συγκεκριμένη λειτουργία. Για να το πετύχετε, περάστε το
ο mainloop() Η συνάρτηση λέει στην Python να εκτελέσει τον βρόχο συμβάντων Tkinter και να ακούσει συμβάντα (όπως το πάτημα κουμπιών) μέχρι να κλείσετε το παράθυρο.
no_sample.bind("" , προσομοίωση)
window.mainloop()
Συνδυάστε τα όλα μαζί και εκτελέστε το πρόγραμμά σας για να προσομοιώσετε το παζλ σε δράση.
Έξοδος του προσομοιωτή Monty Hall με χρήση Python
Κατά την εκτέλεση του προγράμματος, θα δείτε ένα απλό παράθυρο με τις ετικέτες επιλογής Same και Switched. Εισαγάγετε έναν αριθμό δείγματος στο πεδίο στο κάτω μέρος για να δείτε τα προσομοιωμένα αποτελέσματα. Σε αυτό το δείγμα των 3 σειρών, το πρόγραμμα δείχνει ότι κερδίζει μία φορά με την ίδια επιλογή και δύο φορές με διακόπτη.
Αυτά τα αποτελέσματα είναι τυχαία, αλλά μπορείτε να εκτελέσετε την προσομοίωση με μεγαλύτερο μέγεθος δείγματος για μεγαλύτερη ακρίβεια. Στο ακόλουθο μέγεθος δείγματος των 100, η αλλαγή επιλογής κερδίζει 65 φορές.
Επίλυση προβλημάτων με χρήση προγραμματισμού
Το Monty Hall Simulator είναι μια εξαιρετική επίδειξη του τρόπου με τον οποίο μπορείτε να χρησιμοποιήσετε τον προγραμματισμό για να λύσετε προβλήματα της πραγματικής ζωής. Μπορείτε να αναπτύξετε διάφορους αλγόριθμους και να εκπαιδεύσετε μοντέλα για να εκτελέσετε συγκεκριμένες εργασίες, όπως η ταξινόμηση ενός πίνακα ή η βελτίωση της αποτελεσματικότητας ενός συστήματος για τη βέλτιστη παραγωγή.
Διαφορετικές γλώσσες προγραμματισμού προσφέρουν διαφορετικές δυνατότητες και λειτουργίες για να διευκολύνουν τον προγραμματισμό. Χρησιμοποιώντας την Python, μπορείτε να δημιουργήσετε μοντέλα που μπορούν να προβλέψουν τις μελλοντικές τιμές ενός συνόλου δεδομένων με μεγαλύτερη ακρίβεια. Επιπλέον, μπορείτε να αυτοματοποιήσετε επαναλαμβανόμενες λειτουργίες, να μειώσετε την βαρετή εργασία και να βελτιώσετε την ταχύτητα και την ακρίβεια.