LoginSignup
2
2

More than 3 years have passed since last update.

モンティ・ホール問題の数式に頼らない直感的な解説と、Pythonによるシミュレーション

Posted at

モンティ・ホール問題は、確率のパラドックスとして有名な問題です。本記事では、私が考えて最も納得できた数式に頼らない直感的な説明をしてみます。

モンティ・ホール問題

Wikipediaより引用

プレーヤーの前に閉じた3つのドアがあって、1つのドアの後ろには景品の新車が、2つのドアの後ろには、はずれを意味するヤギがいる。プレーヤーは新車のドアを当てると新車がもらえる。プレーヤーが1つのドアを選択した後、司会のモンティが残りのドアのうちヤギがいるドアを開けてヤギを見せる。ここでプレーヤーは、最初に選んだドアを、残っている開けられていないドアに変更してもよいと言われる。
ここでプレーヤーはドアを変更すべきだろうか?

答「プレーヤーはドアを変更すべきである。なぜなら変更しなかった場合の当たる確率が$\frac{1}{3}$なのに対し、変更した場合の当たる確率は$\frac{2}{3}$だからだ。」

解説

プレーヤーが最初に1つドアを選んだ段階では、どのドアも当たりである確率は$\frac{1}{3}$であるはずだ。それがなぜ、司会者が外れのドアを1つ見せた後では変わってしまうのだろうか?

これを理解するために、モンティ・ホール問題に似た以下のような問題を考えてみる。

  1. プレーヤーはドアを1つ選択する
  2. プレーヤーは、「選択しているドア」か、「残り2つのドア」のどちらに当たりがあるか選択を促される。

この場合、誰もが後者の「残り2つのドア」を選択するだろう。なぜなら、当たる確率が前者は$\frac{1}{3}$なのに対し、後者は$\frac{2}{3}$だからだ。

この問題とモンティ・ホール問題の決定的な違いは、「選択していないドアのうち、外れのドアを1つ見せる」という行為の有無である。
モンティ・ホール問題では、この行為により「残り2つのドア」のうちの1つが当たり確率0として確定する。これを整理すると、

  • 「残り2つのドア」に当たりがある確率は$\frac{2}{3}$,
  • 「残り2つのドア」の一方の当たり確率が0に確定

以上より、最後に残った今選択していないドアが当たりである確率が$\frac{2}{3}$となる。

司会者がドアを開示する前後での当たり確率の変化:
Screen Shot 2020-01-26 at 23.30.17.png

よくある誤解

どのドアも当たる確率は同じであるはずだ。よって、一つ外れのドアが確定したのならば、残り2つのドアが当たりである確率はそれぞれ$\frac{1}{2}$である。

この考えは、以下のような問題であれば正しい。

  1. プレーヤーはドアを1つ選択する
  2. 司会者は、(プレーヤーが選択中のものも含め)3つのドアのうち外れのドアを1つランダムに見せる
  3. プレーヤーは、残った2つのドアのうち1つを選択する

この問題とモンティ・ホール問題の決定的な違いは、「司会者が、プレーヤーが選択中のドアを見せることができるか否か」である。
モンティ・ホール問題では、上記はできないことになっている。プレーヤーが選択しているドアが当たりだった場合はこの違いは関係ないが、外れだった場合に大いに影響する。
プレーヤーが選択しているドアが外れであった場合、モンティ・ホール問題では、必ずもう一方の外れのドアが開示される。対して上記の問題では、どの外れのドアが選ばれるかは完全にランダムで、当たりのドアを当てるための何のヒントも得られない。

以上、直感的な説明ではあるが、とりあえず当たる確率がそれぞれ$\frac{1}{2}$にはならないということには納得できるのではないだろうか。

Pythonによるシミュレーション

Python によるシミュレーション例を載せておく。
1万回ゲームを行い、ドアを変更する場合と変更しない場合の勝率をそれぞれ計算した。

import random
random.seed(1)
doors = ["当たり", "ヤギ", "ヤギ"]
stay_wins, change_wins = 0, 0

# 十分な試行回数繰り返す
loop = 10000
for _ in range(loop):
    # 最初にドアを選ぶ
    choose = random.choice(doors)
    # ドアを変更しない場合と変更する場合で、当たりを引いた方に勝数+1
    if choose == "当たり":
        stay_wins += 1
    else:
        change_wins += 1

print("--- 勝率 ---")
print(f"ドアを変更しない場合: {stay_wins / loop}")
print(f"ドアを変更する場合 : {change_wins / loop}")
出力結果
--- 勝率 ---
ドアを変更しない場合: 0.3323
ドアを変更する場合 : 0.6677

最後に

Qiita初投稿です。
どんなコメントでもお待ちしています!!

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2