みさご解体新書

モンティ・ホール問題

問題

あなたはゲームショーに出ている挑戦者です。ここに 3 つのドアがあり、1 つのドアの後ろには景品の新車が、他の 2 つのドアの後ろには、はずれのヤギがいます。あなたはこの中の 1 つのドアを選べるとします。あなたが 1 つのドアを選択した後、司会者が残りのドアのうち、ヤギがいるドアを 1 つ開けます。あなたは最初に選んだドアではなく、残っている開けられていないドアに変更しても構わないと司会者に話しかけられました。さて、あなたはどちらのドアを選択しますか?

解説/アルゴリズム

結論からいうと、この問題はドアを変更すると、しない場合と比べて 2 倍の確率で当たりを引くので、ドアを変更するのが正解となる。

解答の流れ

挑戦者が扉を選択した際、順不同だが、ドアは { 当たり / ハズレ / ハズレ } となっているので、

  • 選んだドアが当たりである確率 ...... 1/3
  • 選ばなかった 2 つのドアのどちらかに当たりがある確率 ...... 2/3

この後、挑戦者が選ばなかった 2 つのドアのうち、ハズレのドアを司会者が開く。

選ばなかった 2 つのドアが 1 つになるが、ドアが減っても当たりの確率自体は変わらない。

つまり、

  • 選んだドアが当たりである確率 ...... 1/3
  • 選ばなかった 1 つのドアに当たりがある確率 ...... 2/3

となり、確率 1/3 のドアと確率 2/3 のドアどちらを選びますか、と問われていることになる。

なので、

  • ドアを変更しなかった場合で当たりを引く確率 ...... 1/3
  • ドアを変更した場合で当たりを引く確率 ...... 2/3

結果は上記のとおりとなる。

ソースコード

montyhall.ts / app.ts

コード例

import * as mh from "./montyhall";

function run(changeTheDoor: boolean, max: number): void {
  let win = 0;
  let total = 0;

  for (let i = 0; i < max; i++) {
    if (mh.run(3, changeTheDoor)) {
      win++;
    }
    total++;
  }
  const winRate = ((win / total) * 100).toFixed(2);

  let text = "扉を変えない場合";
  if (changeTheDoor) {
    text = "扉を変える場合";
  }
  console.log(text);
  console.log(`${win} / ${total} 勝率 ${winRate}%`);
}

const iterations = 10000;

run(true, iterations);
run(false, iterations);
扉を変える場合
6629 / 10000 勝率 66.29%

扉を変えない場合
3322 / 10000 勝率 33.22%

内部で利用しているアルゴリズム

擬似乱数, 床関数