モンティホール問題 を Python で検証

モンティホール問題をご存じでしょうか?簡単なクイズだとおもってもらってよいです。

問題 

あなたと、司会者と、閉じた3つの扉があります。

その扉のどれか一つの後ろにヤギがいます。

あなたはどれか1つを選びヤギがいるドアを当てなければいけません。

あなたが1つの扉を選びます。

すると司会者はあなたが選ばなかった扉の2つのうち、かならずヤギがいないほうの扉を開けて

開けた扉の後ろにはヤギがいないことをあなたに見せます。

そのあと司会者は、司会者が選ばなかったほうの扉に、

あなたの選択を変えてもよいですよ。とそそのかしてきました。

さてここで問題、あなたは、もう一つの空いてない扉に選択をかえたほうがよいでしょうか?

(選択をかえたほうが、ヤギをみつける確率はたかくなるでしょうか?

ではここで、考えてみてください。

司会者に言われた通り、選んだ扉を変えたほうが、ヤギがいる確率が上がるでしょうか?

考えたあとでこの下の文を読んでみてください。。。

詳しく書いてあるページはいっぱいありますので答えの詳細の説明はほかに譲ります。

最近、また話題になったのは、画像処理で映った人などを機械認識をするときに、そこにいる確率などを推定するのに、前のフレームの情報を用いて、推定するという方法があり、その考え方に尤度推定という確率計算技法を使うからです。

尤度推定というと言葉が難しそうですが、尤度の“尤”は、”もっとも”という意味で、次のフレームでそこにいる尤もらしさを推定するという確率の推定方法になります。

この話も深くて面白いですが今回はこの話はしないです。単純に、尤度推定の勉強をしていると、とても有名な一例でこのモンティホール問題にでくわします。そしてはじめ間違えます。そして驚かされます。多くの数学者が、この問題を初めて聞いたときに真の回答を間違えて、真の回答を言っていた人をひどく糾弾したほどでした。

これ私も間違え、答えに驚いたひとりです。ですのでその感動と、確かめを広めるべく、このブログの記事を書きました。

そろそろ答えを書くとすると、みな、結局最後に残った2つの扉のどちらかにいるのだから、当たる確率は50% だから、変えても、変えなくても当たる確率はかわらない!とおもいます。

これが正解!と、言いたいところですがなんと違うのです。

結論から言うと、最初に選んだ扉のうしろにいの確率は33%、後に選んだほうの扉の後ろにいる確率は66%なのです。

すなわち倍です。ですので、変えたほうが2倍も当たる確率があがるのです!!なんと衝撃的でしょうか?

答えを聞いても、まだ信用できないひともいるかとおもいます。これが尤度推定です。

過去に起こった現象により、未来の確率はかわるのです!!

数学的な詳しい説明はおいておいて、それでは検証のPython のソースコードを以下に書いていきます。

ループと乱数を使ってモンテカルロ法的に検証してみたいと思います。

import random
bingo=0
testtimes=0

for count in range(999):
    goat=random.randint(1,3)#ヤギのいる扉の番号1~3どれかを選んで配置
    sel=random.randint(1,3)#自分の選んだ扉の番号1~3どれかを選んで配置


    if goat==1 and sel==1:
        not_open=random.randint(2,3)#司会者が明けない扉
    elif goat==1 and sel==2:
        not_open=1
    elif  goat==1 and sel==3:
        not_open=1
    elif  goat==2 and sel==1:
        not_open= 2
    elif  goat==2 and sel==2:
        not_open=random.randint(2,3)
        if not_open==2:
            not_open=1
    elif  goat==2 and sel==3:
        not_open=2
    elif goat==3 and sel==1:
        not_open=3 
    elif  goat==3 and sel==2:
        not_open=3
    elif  goat==3 and sel==3:
        not_open=random.randint(1,2)

    testtimes=testtimes+1#試験回数

    if not_open==goat:#司会者が明けない扉にヤギがいた場合カウントを増やす。
        bingo=bingo+1#変えたときの正解数

    print(testtimes,bingo,float(bingo/testtimes))司会者が明けない扉を選んでにビンゴになる総回数/総試験回数

回数を増やしていくと2/3=0.66に収束していくことがわかると思います。

オススメの本↓。

コメント

タイトルとURLをコピーしました