てぃぐれのプログラマwiki

ワクワクに従う

モンティ・ホール問題 Python

最近、youtubeで目にするパラドックスの一つ、モンティ・ホール問題をpythonで書いて検証してみた。wikipedia曰く、この問題はアメリカで大論争になったという。プログラムを組んで確認してみることにする。

 

モンティー・ホール問題を軽く説明する。

3つのドアのうち一つが当たり。

回答者は最初に一つのドアを選ぶ。

その後、残りのドアのうち、外れのドアが司会者によって開けられる。

回答者は、残りのドアに変更することができる。

さて、選び直した方が、当たりを引く可能性は大きいのか。

選びなおさない方がいいのか。

f:id:tigretic:20220110224145j:plain

コード

    import random

# ドアの数
DOORS_NUMBER = 3
# ドアを作成
def makeDoors(number):
    if number <= 1:
        print("please input more than 1")

    doors = list(range(number))
    correct = random.randrange(number)

    doors[correct] = "o"

    return doors

if __name__ == "__main__":
    correct = 0

    for i in range(10000):#試行回数

        doors = makeDoors(DOORS_NUMBER)

        # 開けたいドアを指定する
        open_number = ""
        while(True):
            ## 開けたいドアを指定する場合
            # open_number = input("which door will you open?\n")

            # 開けたいドアはランダムで決める
            open_number = random.randrange(DOORS_NUMBER)

            if DOORS_NUMBER > int(open_number):
                break
        
        # o:あたり x:ハズレ
        another_door = doors.index("o")

        final_answer = ""
        # 指定したドアが正解の場合
        if doors[int(open_number)] == "o":
            while(True):
                another_door = random.randrange(DOORS_NUMBER)
                if another_door != int(open_number):
                    break
            
        # y : 選びなおす, n : 選びなおさない
        final_answer = "y"

        if final_answer == "y":
            if doors[another_door] == "o":
                print("o/y")
                correct = correct +1

            else:
                print("x/y")
        else:
            if doors[int(open_number)] == "o":
                print("o/n")
                correct = correct +1

            else:
                print("x/n")

    # 正解数
    print(correct)
    # 正解率
    print(f'{correct/10000 * 100}%') ## 66%~68%に落ち着く。

ちなみに選びなおさないと32%~34%に落ち着く。

ドアの数がもっと多いと、分かりやすくなる。

f:id:tigretic:20220110224142j:plain

 

最初に選んでないドアの方が多く、当たりは含まれやすいので、選び直した方が良いのだ。