プログラミングできたらカッコいいなと思って、敷居が低くて人気のpythonを勉強?しながら遊んでます。
参考本はオライリーの退屈な事はpythonにやらせよう、とか、アプリのsololearnとかで見てます。あと一年位前にprogateってアプリでpythonとか学んだ程度です。
スクレイピングとかエクセル操作、ファイル操作とか一通りやって、しょぼいプログラムなら組めるようになってきて、楽しい。
単純な問題なら、コード書いてループしてもらえば、何百回でも計算を繰り返してくれて凄い。コンピュータを褒めたい。そんな気持ちになる。
例えばここに有名な
モンティホール問題というのがある。
3つの扉があって、正解は一つ。自分が適当にどれか一つ選ぶと、司会者は残り二つから、間違った扉を一つ教えてくれる。
次に自分は最初に選んだ扉を変えるか変えないか選べる。
変えるのが良いか変えないのが良いか、どっちでしょう。
という問題だ。
いっぱんの直感的には、変えても変えなくても同じだろ。と考えてしまうが、
正解は変えたほうが、正解率はぐっと上がる。
pythonでコード書いて、変える場合と、変えない場合1万回やってもらって試してみた。
結果は
>>>
変えない場合3323回正解、6677回失敗
変える場合6667回正解、3333回失敗
だった。コードは以下
#! Python3
# 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 = [0, 1, 2]
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 = [0, 1, 2]
select_list.remove(answer)
if answer == select:
sikaisha = random.choice(select_list)
else:
select_list.remove(select)
sikaisha = select_list[0]
# 変える
re_select_list = [0, 1, 2]
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