モンティ・ホール問題をご存知でしょうか?
この問題、結論を知ってもなお「本当に?」と首をかしげてしまう人が後を絶ちません。
さて、あなたは正しくモンティ・ホール問題を理解できるでしょうか…?
- 3つの閉じたドアがあります。
- 1つのドアの後ろには当たり(豪華な車など)、残りの2つのドアの後ろにはハズレ(ヤギなど)が入っています。当たりがどのドアかは、あなたには分かりません。
- あなたは、当たりだと思うドアを1つ選びます。
- すると、司会者のモンティ・ホールが登場します。彼はどのドアが当たりかを知っています。そして、あなたが選ばなかったドアの中から、必ずハズレが入っているドアを1つ開けて見せてくれます。
- ここで、モンティはあなたに問いかけます。「あなたは、最初に選んだドアのままにしますか?それとも、残っているもう一方のドアに変更しますか?」
さて、再度確認します。
- 「最初に選んだドアのままにする」
- 「残ったもう一方のドアに変更する」
どちらのほうが、当たりを引く確率は上がると思いますか?
結論から言うと、答えは「残ったもう一方のドアに変更したほうが、当たり確率が上がる」です。ドアを変更した方が、当たる確率は2倍になります。
- 変更しない場合の当たる確率:1/3
- 変更する場合の当たる確率:2/3
「え?残りは2つのドアなんだから、確率はどっちも1/2じゃないの?」そう思ったあなた、まさにモンティ・ホール問題の「直感の罠」にはまっています。
なぜそうならないのか、解説しましょう。
- ステップ1:あなたが最初に選ぶのは「当たり」か「ハズレ」か?
まず、あなたが最初にドアを選ぶ時点で考えてみましょう。- あなたが当たりのドアを選ぶ確率:1/3
- あなたがハズレのドアを選ぶ確率:2/3
当然、ハズレのドアを選ぶ確率の方が高いですよね。これが最初のポイントです。
- ステップ2:司会者の行動の意味を考える
次に、司会者の行動がどう影響するかを見ていきます。司会者は「当たりを知っていて」「必ずハズレを開ける」ことを思い出してください。
もし、あなたが最初に「当たり」を選んでいたら(確率1/3)、残りの2枚は両方ハズレです。
司会者はどちらか一方のハズレを開けます。この場合、変更するとハズレになります。もし、あなたが最初に「ハズレ」を選んでいたら(確率2/3)
残りの2枚のうち、1枚は当たり、もう1枚はハズレです。
司会者は必ずハズレの方を開けなければなりません。
ということは、残っている開けられなかったドアは、必ず当たりになります。この場合、変更すると当たりになります。 - ステップ3:確率をまとめる
これを整理すると、- 変更しない場合:当たるのは「最初に当たりを選んだ場合」のみ→確率1/3
- 変更する場合:当たるのは「最初にハズレを選んだ場合」のみ→確率2/3
つまり、「最初にハズレを選ぶ」という確率の高い(確率2/3)状況を引いていた場合、司会者のアシストによって、変更すれば必ず当たりにたどり着ける、というわけです。
- ステップ4:極端な例で考えてみる(ドアが100枚だったら?)
まだピンとこない方のために、ドアの数を極端に増やしてみましょう。ドアが100枚あります。当たりは1枚だけです。
あなたは1枚のドアを選びます(当たる確率は1/100)。
司会者は、あなたが選ばなかった99枚のドアの中から、ハズレのドアを98枚開けて見せます。
残っているのは、あなたが最初に選んだドアと、司会者が開けなかったもう1枚のドアです。
さあ、変更しますか?
あなたが最初に選んだドアが当たる確率は、依然としてわずか1/100です。一方、司会者が98枚ものハズレを除外してくれた後に残った「もう1枚のドア」。これが当たりである確率は、なんと99/100になります!(最初にあなたが選ばなかった99枚分の確率が、その1枚に集約されたイメージです)
どうでしょうか?
このケースならば、ドアを変更したほうが当たり確率が上がることが理解しやすくありませんか?
ドアが3つの場合も、起こっていることは本質的に同じなのです。
では、なぜこれほど多くの人々が(専門家でさえも)、この問題の答えを誤解してしまうのでしょうか?
主な原因は以下の点にあります。
- 直感による単純化
「最終的に残ったドアは2つだけだから、確率は五分五分(1/2)だろう」と考えてしまうのが、最も一般的な誤解です。ドアが2つになったという表面的な状況だけを見て、そこに至るまでのプロセスを無視してしまうのです。 - 「条件」の変化を見落とす
司会者がドアを開けたことで、状況には新しい「条件」が加わっています。司会者はランダムにドアを開けたわけではありません。「当たりを知っていて」「意図的にハズレを選んで開けた」のです。この司会者の行動が持つ情報を考慮に入れないと、正しい確率を導き出せません。 - 確率の独立性の誤解
最初のドア選択(確率1/3)と、司会者がドアを開けた後の選択を、まったく別々の独立した確率の問題として捉えてしまう傾向があります。しかし、これらは連続した事象であり、司会者の行動は後の選択肢の確率に影響を与えています。
実はですね…、筆者は、この解説を読んでもイマイチ納得ができないんですよ…
そこで、生成AI Geminiに頼んで、「モンティ・ホール問題のシミュレーションを行うGoogle Apps Scriptを作成してください」とお願いしました。
実際に作成したGoogleAppsScriptの「モンティ・ホール問題シミュレーター」を直接皆さまに触ってもらうことは、セキュリティ上、問題だらけなので、動かしている様子をYoutubeにアップしました。
※このシミュレーターは、Geminiに何度か修正をしてもらった結果、作成したものです。その詳しい経緯は、後述します。
本シミュレーターは、Googleが提供する生成AIの有料版である「Gemini Advanced 2.5Pro(experimental)において、GoogleAppsScript(略称:GAS)のスクリプトを作成してもらいました。
なお、Geminiが生成したGASのクオリティを上げるため、何度もスクリプトを修正させています。
- 質問
Googleスプレッドシート上で、モンティ・ホール問題をシミュレーションするGASを作成してください。シミュレーション回数は100回とし、その100回の結果はスプレッドシートのシート状に出力した上で、プレイヤーが最初の選択からドアの選択を変えた場合、変えなかった場合の確率も算出してください。 - 回答
はい、承知いたしました。
Google スプレッドシート上でモンティ・ホール問題を100回シミュレーションし、その結果と確率を算出するGoogle Apps Script (GAS) を作成します。以下の手順でスクリプトを設定・実行してください。
1. Google スプレッドシートの準備
新しい Google スプレッドシートを開きます。
シート名はデフォルトのままでも構いません。
2. スクリプトエディタを開くスプレッドシートのメニューから「拡張機能」>「Apps Script」を選択します。
新しいブラウザタブまたはウィンドウでスクリプトエディタが開きます。
3. スクリプトのコピー&ペーストスクリプトエディタに表示されている既存のコード(function myFunction() { … } など)をすべて削除します。
以下のコードをコピーし、スクリプトエディタに貼り付けます。※生成されたGASは省略(後で完成バージョンを記します)
- 再質問
このスクリプトに以下の仕様を追加してください。
・セルE2からE101の「当たり」の数をセルE103に、セルF2からF101の「当たり」の数をセルE103にセルF103にカウントし、セルD103に「当たりの数」とテキストを入れる。
・シミュレーションした結果は、新たに追加したシートに記述し、シート名は、スクリプトを実施した日時を反映した「yyyymmddd-hhdd」とする - 再質問
さらに、A列~H列までの幅を、テキストサイズに合わせてフィットさせてください - 再質問
さらに以下のように変更してください
・最初に10~500回の間で、何回シミュレーションを行うのか確認する
・「・セルE2からE101の「当たり」の数をセルE103に、セルF2からF101の「当たり」の数をセルE103にセルF103にカウントし、セルD103に「当たりの数」とテキストを入れる。」について、シミュレーション結果を記したシートの、最後のシミュレーション結果から1行開けて、それぞれE列のセル、F列のセルにカウント数を、同じ行のD列のセルに「当たりの数」というテキストを入れる。 - 再質問
「さらに、A列~H列までの幅を、テキストサイズに合わせてフィットさせてください」の部分が抜けてしまいました。追加してください。 - 再質問
列幅の調整がうまくいっていません。全体的に狭いです。
1行目(見出し行)のテキストがすべて見えるように調整してください。 - 再質問
さらに1行目に、「テキストを折り返す」を追加してください - 列幅の自動調整と手動微調整を行った後に、処理を追加します。
- newSheet.getRange(“A1:H1″) または newSheet.getRange(1, 1, 1, 8) でヘッダー行の範囲を取得します。
- 取得した範囲に対して .setWrapStrategy(SpreadsheetApp.WrapStrategy.WRAP) を実行します。
- この最新のコードをスクリプトエディタにコピー&ペーストし、保存してください。
- メニューから「モンティホール」>「シミュレーション実行 (新規シート)」を実行します。
- 出力されたシートで、1行目のヘッダーテキストが、必要に応じてセル内で折り返されて表示されることを確認してください。列幅によっては複数行になる場合があります。
※回答および生成されたGASは省略します(後でまとめて表記します)。
回答
はい、承知いたしました。
ヘッダー行(1行目)のA列からH列までのセルに「テキストを折り返す」設定を追加します。これにより、列幅が少し狭い場合でも、ヘッダーテキストがセル内で改行されてすべて表示されるようになります。
以下の手順でコードを修正します。
修正を反映したコード:
→ こちらからご確認ください
使い方:
特別な言い方をするわけではなく、口語に近いような言い方でGeminiに命令を下しても、きちんとスクリプトを生成してくれるのが分かるでしょうか?
ただし、一方でGeminiもポカミスをやらかすので、そのあたりはきちんとツッコんで、スクリプトを修正させています。
このように生成AIにプログラムを書かせることができることは、またいずれ秋元通信で取り上げましょう。