Site icon George的生活點滴

Python -The Monty Hall Problem

蒙提霍爾問題
這是一個有趣的數學機率問題,源自於美國的電視節目 Let’s Make a Deal,遊戲有三扇門,其中一扇門後藏著汽車,另二扇門則是山羊,參賽者先從三扇門中選擇一扇,之後主持人會將再移除另兩扇門的其中一扇,而該扇門後一定的山羊。此時參賽者可以有再一次的選擇權,看是要保留第一次選擇的門,還是選擇主持人留下的另一扇門。
如果你是參賽者你會換嗎?在寫這個程式之前,我的選擇是不換,但測試後的結果,還是換比較好。

#The Monty Hall Problem
#https://www.george.tw/2020/03/05/python-the-monty-hall-problem/
import random
guessCount=0
rightCount = 0
while True:
    door=random.randint(1,3)           # Generates a random integer range of 1-3, this is for a prize
    firstChoice=int(input("Choose a door from 1-3 , to exit the program, press 4 :"))  # Let user choose a door
    if (firstChoice==4): break         #  if user press 4 then exit while loop
    guessCount =guessCount +1          # Count the number of guesses
    doorList=[1,2,3]                   # This array are the number of the doors
    doorList.pop(door-1)               # We removed the door of the prize's in the array
    if (firstChoice != door):          # If user's choice is not equal to prize 
        newList=[firstChoice,door]     # We put user's choice and the prize in to the new array
    else:    
        second=random.randint(1,2)     # If user's choice is equal to prize, we generates a random integer range of 1-2, and removed one of the doors
        newList=[doorList[second-1], door]     
    newList.sort()                    
    secondChoice=int(input("Choose another door from {:d},{:d}:".format(newList[0],newList[1])))   # Let user choose new doors 

    if (secondChoice==door):          # The result of user choice 
        print ("You win, the door is {:d}".format(door))
        rightCount = rightCount+ 1    #  The count of correct choice
    else:
        print ("You loss, the door is {:d}".format(door))

print("{:d} guesses in total".format(guessCount))
print("{:d} correct guesses".format(rightCount))
print ("The chance of guessing correctly is {:.3f}".format(rightCount/guessCount))   # Result


door=random.randint(1,3) 利用亂數產生一扇門,這扇門代表獎品
firstChoice 使用者第一次猜測的門(1-3) , 4 離開程式
guessCount 計算使用者猜測的次數
doorList 3 扇門,編號 1 , 2 , 3
doorList.pop(door-1) 先把是獎品編號的門從陣列中移出
if .. else … 這裡要產生新的選擇:
如果參賽者的猜測中沒有獎品,
我們把使用者的選擇和有獎品的門放入新的陣列中
如果參賽者選中門
我們先隨機產生一個數字,
留下一扇門並與 參賽者選中的門產生一個新的陣列
newList.sort() 陣列排序
判斷結果,並計算機率

原始碼: GitHub

大致上換的得獎機率會在 66.6 % 上下
…待續

Exit mobile version