python #大人になってから学び始めた事 | 不惑のクワガタ日記

不惑のクワガタ日記

はじめた当初はクワガタの日記だったのですが、、、
現在は人工知能と戯れる日記になってます。

(私)
プログラム言語のpythonってありますよね、なんでpythonっていうんですか?

(chatGPT)
Pythonという言語名は、創始者のGuido van Rossum氏が愛好していたテレビ番組「Monty Python's Flying Circus」に由来しています。彼は、このテレビ番組が好きで、言語名にこの名前を使うことで、Pythonの楽しさ、ユーモア、そしてわかりやすさを表現しようと考えたのだそうです。そのため、Pythonのドキュメントやチュートリアルなどでも、しばしばMonty Pythonのキャラクターやジョークが使われることがあります。




(私)
「Monty Python」からきているんですね。
少し話は、飛ぶのですが「モンティ・ホール問題」について解説をお願いいたします。

(chatGPT)
「モンティ・ホール問題」とは、アメリカのテレビ番組「Let's Make a Deal」の1つのゲームである「3つの扉問題」として知られています。問題の内容は、以下のようになります。

あなたは、3つの扉(ドア)の前に立っています。1つの扉の後ろには、新しい車が置いてあります。残り2つの扉の後ろには、ヤギが各1頭ずついるだけです。あなたは、最初に1つの扉を選択します。その後、司会者が、あなたが選んだ扉とは異なる1つの扉を開けて、その後ろにヤギがいることを示します。そして、司会者は、あなたが最初に選んだ扉を変更することができるように提案します。あなたは、最初に選んだ扉を変更するべきでしょうか?

この問題には、以下のような2つの考え方があります。

1.最初に選んだ扉を変更する必要はない。
2.最初に選んだ扉を変更する方が勝率が高くなる。

実は、2つ目の考え方が正しいとされています。最初に選んだ扉を変更することで、勝率が2/3になることが証明されています。その理由は、最初に選んだ扉は、3つの扉のうち1つしか当たりではないため、2/3の確率でヤギの扉を選んでしまうからです。つまり、最初に選んだ扉以外のもう1つの扉が当たりの扉である確率が1/3であることから、2/3の確率で当たりの扉は、最初に選んだ扉以外にあることになります。

以上が、モンティ・ホール問題の解説です。




(私)
感覚的には、確率は同じだろうと思うのだけど、よくよく考えると2の方が良いのですよね。
モンティ・ホール問題シミュレータをpythonで作りたいのですが、手伝っていただけますか?

(chatGPT)
もちろんです!以下は、Pythonで実装したモンティ・ホール問題のシミュレータの例です。

import random

def monty_hall_game(change):
    doors = ['goat', 'goat', 'car']
    random.shuffle(doors)

    first_choice = random.choice([0, 1, 2])
    opened_door = [i for i in range(3) if i != first_choice and doors[i] == 'goat'][0]

    if change:
        second_choice = [i for i in range(3) if i != first_choice and i != opened_door][0]
        return doors[second_choice] == 'car'
    else:
        return doors[first_choice] == 'car'

num_trials = 10000
win_stay = 0
win_change = 0

for i in range(num_trials):
    if monty_hall_game(False):
        win_stay += 1
    if monty_hall_game(True):
        win_change += 1

print("Winning rate when stay: {:.4f}".format(win_stay/num_trials))
print("Winning rate when change: {:.4f}".format(win_change/num_trials))

このプログラムは、monty_hall_game関数で1回のゲームを実行し、最初に選んだドアを変更する場合と変更しない場合の2つのシナリオをシミュレートしています。num_trials回のゲームを実行し、勝率を計算しています。

上記のコードでは、Trueを引数としてmonty_hall_game関数を呼び出すと、最初に選んだドアを変更するシナリオが実行されます。Falseを引数として呼び出すと、変更しないシナリオが実行されます。




(私)
ありがとうございます。さっそく走らせてみました

$ py ts63.py
Winning rate when stay: 0.3355
Winning rate when change: 0.6666

というように、チェンジした方が2倍よいことがわかりました!!

(chatGPT)
そうですね!モンティ・ホール問題では、最初に選んだ扉を変更することで、勝率が2倍になるということがわかります。シミュレータを実行してみることで、このことが確認できたようで良かったです。また何かあればお知らせください!

 

 

大人になってから学び始めた事