モンティ・ホール問題は、視点を逆転するとわかりやすい。最初は2/3でハズレ。残るドアが開いた「後で」選択肢を変えれば、これがそのまま当たりの確率になる。抽象的に言えば、最初に選ばなかった選択肢たちの確率がギュッとまとまってキングスライムになる。

直感的にわかりやすい解き方

例えばドアを4枚に増やして考えてみる。4枚のドアのうち、当たりは1つ。最初の選択では、当たる確率は1/4だ。ここで当たり以外の残り2枚のドアを開けたとする。先に述べたように、いま回答者が選んでいるドアは1/4で当たりである。もう一方のドアが当たりの確率は、1/2だろうか、それとも1/4だろうか。

開けられた2枚のドアは、それぞれ1/4の確率で当たりだった。残る1枚のドアが当たりの確率も、最初の段階では1/4だ。しかし、今は2枚のドアが開かれている。ここで選択を変えれば、1/4+1/4+1/4の確率が得られる。つまり3/4という確率で当たりを引ける。変えなければ、2枚のドアは開かれなかったのと同じだ。当たりの確率は1/4で、ハズレの確率は3/4となる。ドアが3枚の場合も、5枚以上の場合も、同じ理屈が成立する。

だから、ドアを変更したほうが当たる確率が高い。

……などと言われても、すぐには納得できないかもしれない。直感に反するからだ。選択肢を変更しようとしまいと、最終的にはどちらも1/2、あるいは最初から変わらず1/3では? そう考える方が自然である。

そもそも何が問題なのか、ゆっくり消化してみたい。

モンティ・ホール問題とは

モンティ・ホール問題とは、以下のような問題である。

  1. 3枚の閉ざされたドアがある。
  2. このうち、当たりのドアが1枚あり、回答者はそれを当てたい。
  3. 回答者は、まず3枚のうちから1枚のドアを選ぶ(まだドアは開けない)。
  4. 司会者は、残った2枚のドアから1枚(ハズレのドア)を開いて見せる。
  5. その情報を得た上で、回答者には選ぶドアを変更する権利が与えられる。
  6. 選択肢を変えるべきか、変えないべきか、それが問題だ。

なお、これはアメリカのテレビ番組の企画であり、モンティ・ホールとはその司会者の名前だ。

この問題に対して、マリリン・ボス・サバントという作家が最初に論理的な答えを提示した。しかし、大多数が異を唱え、大きなムーブメントとなった。マリリンが高IQで、今で言うインフルエンサー的な存在だったこともあってか、ひどい当て擦りを言う学者もいた。最終的には、コンピュータシミュレーションで彼女の正しさが証明され、議論は決着したそうである。

おもしろい。マリリンかっこいい。

納得できない理由

最後に残るのは2枚のドア。片方が当たりで、片方がハズレ。すでに一方を選んでおり、当たる確率は1/2。これをもう一方のドアに変えても、やはり当たる確率は1/2で、変わらない。

あるいは、最初の選択で当たる確率は1/3。そもそも問題は、3枚のドアから1つを選ぶ、というものだ。間に何があろうと、それは変わらない。選ぶドアを変えようが変えまいが、当たる確率は1/3のままだ。

そのはずだ。

あと、選択肢を変えない方がギャンブラーっぽくてかっこいい。一途な方がなんとなくいいことがありそうな気がする。選択肢を変えるのは、なんだか優柔不断っぽくて軟弱だ。出題者の手のひらの上で転がされている気がする。選択肢を変えていい、なんてあえて提示してくるということは、そこに意図があるはずだ。変えない方がいい。そんな気がする。

とにかく、この問題は直感に反する。納得できないからと言ってなんら恥じることはない。数学者だって大勢間違えたのだから。

わかりやすくする方法

最初にした選択は1/3。だから間に何があっても1/3。最後に示される選択は1/2。だから事前に何があっても1/2。

この2つの何が問題なのか。「間に/事前に何があっても」という前提が問題である。マリリンはこの誤解を説明するために、ドアを100万枚に増やすという試みをした。

Suppose there are a million doors, and you pick door #1. Then the host, who knows what’s behind the doors and will always avoid the one with the prize, opens them all except door #777,777. You’d switch to that door pretty fast, wouldn’t you?

(100万枚のドアがあり、あなたが1番のドアを選んだとする。すると、ドアの向こうに何があるか知っていて、賞品があるドアを必ず避けるホストが、777,777番のドア以外のドアを全部開ける。あなたはすぐにそのドアに切り替えるでしょう?)

引用元:Monty Hall problem – Wikipedia

こう考えると、先の前提が間違っていることがよくわかる。選択肢を変えないと、1/1,000,000から選択したことになる。変えれば一気に999,999/1,000,000だ。1/2にはならない。すでに999,998枚のドアは開かれ、ハズレであることがわかっているからだ。選択肢を変えれば、これらのドアは自分で開いたのと同じことになる。

つまり最初のドアがハズレである確率が、そっくりそのまま当たる確率になる。

シミュレーションしてみる

以下は、JavaScriptで書いたモンティ・ホーム問題の簡単なシミュレーションである。デフォルトでは、ドアの数は3つ、試行回数は1000に設定している。ドアの数は最大で1000、試行回数は10万回まで増やせる(本当はドアの数を最大100万枚にしたかったが、わたしの怠惰なコードでは、フリーズしちゃって無理だった)。

ともかく、試行回数を増やすと、当たる確率は2/3(66.666…%)に近づくはずである。

また、ドアの数を増やすと、そのぶんだけ当たる確率が上がっていくことがわかるかと思う。

js
function runSimulation() {
  const _metaData = getMetaData();
  if (!_metaData) return;
  const { MAX_TRIAL, DOORS } = _metaData;
  let hit = 0;

  for (let trial = 0; trial < MAX_TRIAL; trial++) {
    const allDoors = [...Array(DOORS).keys()];
    const hitIndex = Math.floor(Math.random() * DOORS);
    const firstChoice = Math.floor(Math.random() * DOORS);
    const openedDoors = getOpenedDoors(allDoors, hitIndex, firstChoice);
    const secondChoice = allDoors.find(
      (door) => door !== firstChoice && !openedDoors.includes(door)
    );

    if (secondChoice === hitIndex) {
      hit++;
    }
  }

  const probability = ((hit / MAX_TRIAL) * 100).toFixed(2);
  const result = document.querySelector("#result");
  result.textContent = `当たる確率: ${probability}% (${hit}/${MAX_TRIAL}回)`;
}

function getOpenedDoors(allDoors, hitIndex, firstChoice) {
  const randomMiss = allDoors.findIndex((_, i) => i !== hitIndex);
  const filterTarget = hitIndex === firstChoice ? randomMiss : firstChoice;
  return allDoors.filter((_, i) => i !== hitIndex && i !== filterTarget);
}

initUI();
function initUI() {
  generateInput("ドアの数", "doors", 2, 1000, 3);
  generateInput("試行回数", "max_trial", 1, 100000, 1000);

  const result = document.createElement("p");
  result.id = "result";
  document.body.appendChild(result);

  runSimulation();
}

function generateInput(labelName, id, min, max, initVal) {
  const container = document.createElement("div");
  const label = document.createElement("label");
  label.for = id;
  label.textContent = `${labelName}`;

  const input = document.createElement("input");
  input.type = "number";
  input.id = id;
  input.name = id;
  input.min = min;
  input.max = max;
  input.step = "1";
  input.value = initVal;
  input.oninput = runSimulation;

  label.appendChild(input);
  container.appendChild(label);
  document.body.appendChild(container);
}

function getMetaData() {
  const MAX_TRIAL = parseInt(document.querySelector("#max_trial").value, 10);
  const DOORS = parseInt(document.querySelector("#doors").value, 10);

  if (
    isNaN(MAX_TRIAL) ||
    MAX_TRIAL < 1 ||
    MAX_TRIAL > 100000 ||
    isNaN(DOORS) ||
    DOORS < 2 ||
    DOORS > 1000 ||
    MAX_TRIAL * DOORS > 10000000
  ) {
    let errMsg = document.querySelector("#errMsg");
    if (!errMsg) {
      errMsg = document.createElement("p");
    }
    errMsg.id = "errMsg";
    errMsg.style.color = "red";
    errMsg.textContent = "無効な値(大きすぎるかNaN)です";
    document.body.appendChild(errMsg);
    return;
  } else {
    const errMsg = document.querySelector("#errMsg");
    if (errMsg) {
      document.body.removeChild(errMsg);
    }
  }

  return { MAX_TRIAL, DOORS };
}

余談:ロシアン・ルーレットで考えてみる

ロシアン・ルーレットで考えてみると、モンティ・ホール問題のパラドックスが持つ印象を逆転できそうな気がする。

命懸けのゲームに心酔した変質者が、ロシアン・ルーレットを強制してくる。弾丸は六発のうち一発。わたしが震える手でシリンダーを回し、銃口をこめかみに当てると、変質者は楽しそうに弾倉を覗き込んで言う。

「左右4つの弾倉は空。残る弾丸は、上か下。上だったらあなたは死に、下だったら生き残る、というわけ。希望するなら、いまから上下を入れ替えてもいい。どうする?」

「……こうする!」

変質者に銃口を向け、引き金を引きまくるわたし。

カチンカチンカチンカチィン! 空回る弾倉。

目を剥いて拳銃を見るわたし。

懐からおもむろにオートマチック拳銃を取り出す変質者。

「はわわ、はわわ〜〜!」

口元に手をやり怯えるわたし。

わたしに拳銃を突きつける変質者。

「ゲームオーバー」

パンッ!

参考資料