フヨダ

自分の勉強と記憶力改善のために、興味あることを書いていきます なるべく分かりやすく

最近pythonを学びだしたのでモンティホール問題を

プログラミングできたらカッコいいなと思って、敷居が低くて人気のpythonを勉強?しながら遊んでます。

 

参考本はオライリーの退屈な事はpythonにやらせよう、とか、アプリのsololearnとかで見てます。あと一年位前にprogateってアプリでpythonとか学んだ程度です。

 

スクレイピングとかエクセル操作、ファイル操作とか一通りやって、しょぼいプログラムなら組めるようになってきて、楽しい。

単純な問題なら、コード書いてループしてもらえば、何百回でも計算を繰り返してくれて凄い。コンピュータを褒めたい。そんな気持ちになる。

 

例えばここに有名な

モンティホール問題というのがある。

 

3つの扉があって、正解は一つ。自分が適当にどれか一つ選ぶと、司会者は残り二つから、間違った扉を一つ教えてくれる。

次に自分は最初に選んだ扉を変えるか変えないか選べる。

変えるのが良いか変えないのが良いか、どっちでしょう。

 

という問題だ。

 

いっぱんの直感的には、変えても変えなくても同じだろ。と考えてしまうが、

正解は変えたほうが、正解率はぐっと上がる。

 

pythonでコード書いて、変える場合と、変えない場合1万回やってもらって試してみた。

結果は

>>>

変えない場合3323回正解、6677回失敗
変える場合6667回正解、3333回失敗

だった。コードは以下

 

#! Python3
# -*- coding: utf-8 -*-

# 0, 1, 2 三つの扉があり、司会者は1つ正解を知っている。
# 私は1つ扉を選ぶと、司会者はそれ以外の間違った扉を教えてくれる。
# 次に私は今いる扉を変更するか、しないか選ぶことができる。確立に違いはあるか

import random

correct_count = 0
miss_count = 0
# 変えないとき
for i in range(10000):        
    answer = random.randint(0,2)
    select = random.randint(0,2)
    select_list = [012]
    select_list.remove(answer)
    if answer == select:
        sikaisha = select_list[random.randint(0,1)]
    else:
        select_list.remove(select)
        sikaish = select_list[0]
    if select == answer:
        correct_count +=1
    else:
        miss_count += 1
print("変えない場合{}回正解、{}回失敗".format(correct_count, miss_count))

# 変える場合
correct_count = 0
miss_count = 0
for i in range(10000):        
    answer = random.randint(0,2)
    select = random.randint(0,2)
    select_list = [012]
    select_list.remove(answer)
    if answer == select:
        sikaisha = random.choice(select_list)
    else:
        select_list.remove(select)
        sikaisha = select_list[0]
    # 変える
    re_select_list = [012]
    re_select_list.remove(select)
    re_select_list.remove(sikaisha)
    select = re_select_list[0]
    
    if select == answer:
        correct_count +=1
    else:
        miss_count += 1
print("変える場合{}回正解、{}回失敗".format(correct_count, miss_count))


 

変えない場合3323回正解、6677回失敗
変える場合6667回正解、3333回失敗

 

おー。って感じです。なんか収束してる。

 

数学の素養があれば、確率の考え方でぱっと分かるんだろうけど、

こういった力技の計算だともっとなんか納得がいきます。

 

ありがとうpython