今回はあの有名な
クイズ番組の問題のシミュレーションです。
解説はこちら
モンティホール問題
解説
開けるドアを
変える場合 と 変えない場合
勝率がどうなるのかを計測します。
シミュレーションコードはこちら
スイッチしなかった場合の勝率: 32.8100%
この場合
開けるドアを変えた場合は 3分の2
変えない場合は3分の1
の確率で景品を得る事ができます。
つまり、開くドアを変えた方がお得で
約67%の確率で当たりを引けます。
残るのが2個のドアだから50%の確率というのは
まやかしでした。
ちなみにドアの数が増えれば増えるほど
ドアを変えた方が勝率は高くなります。
こんな感じで、直感的に迷う問題でも
プログラムであればシミュレーション出来るので
正しい答えを導き出せる手助けになります。
色々試してみてください
それでは。
クイズ番組の問題のシミュレーションです。
解説はこちら
モンティホール問題
最後にプレイヤーはドアを変えるか
そのままかを選ぶ事が出来る
そのままかを選ぶ事が出来る
プレーヤーが1つのドアを選択したあと
外れのドアが1つ開放される
外れのドアが1つ開放される
残り2枚の当たりの確率は直感的には
それぞれ 50% になるように思えるが
それぞれ 50% になるように思えるが
はたしてそれは正しいだろうか...
解説
開けるドアを
変える場合 と 変えない場合
勝率がどうなるのかを計測します。
シミュレーションコードはこちら
import random def monty_hall_simulation(num_doors=3, num_trials=10000): switch_wins,stay_wins = 0,0 for _ in range(num_trials): # 車を隠すドアをランダムに選ぶ doors = ['goat'] * (num_doors - 1) + ['car'] random.shuffle(doors) car_index = doors.index('car') # プレイヤーが最初に選ぶドアをランダムに選ぶ player_choice = random.randint(0, num_doors - 1) # モンティが開けるドアを決定する(車とプレイヤーの選択以外) monty_choices = [i for i in range(num_doors) if i != player_choice and i != car_index] monty_opened = random.sample(monty_choices, num_doors-2) # プレイヤーがドアを変更する場合の勝敗 switch_choice = next(i for i in range(num_doors) if i != player_choice and i not in monty_opened) if doors[switch_choice] == "car": switch_wins += 1 # プレイヤーがドアを変更しない場合の勝敗 if doors[player_choice] == "car": stay_wins += 1 print(f"スイッチした場合の勝率: {switch_wins / num_trials * 100:.4f}%") print(f"スイッチしなかった場合の勝率: {stay_wins / num_trials * 100:.4f}%") # シミュレーション実行 num_doors = 3 num_trials = 10000 monty_hall_simulation(num_doors=num_doors, num_trials=num_trials)スイッチした場合の勝率: 67.1900%
スイッチしなかった場合の勝率: 32.8100%
この場合
開けるドアを変えた場合は 3分の2
変えない場合は3分の1
の確率で景品を得る事ができます。
つまり、開くドアを変えた方がお得で
約67%の確率で当たりを引けます。
残るのが2個のドアだから50%の確率というのは
まやかしでした。
ちなみにドアの数が増えれば増えるほど
ドアを変えた方が勝率は高くなります。
こんな感じで、直感的に迷う問題でも
プログラムであればシミュレーション出来るので
正しい答えを導き出せる手助けになります。
色々試してみてください
それでは。
コメントする