モンティ・ホール問題を計算してみる

カモン!はなまるボックスッッ!!(一回転)

有名な確率の問題らしいのだが、こーゆーのがある。

3つのドアがあり、1つだけが「当たり」でドアの向こうにある賞金ゲット! 確率はもちろん1/3。回答者は1つを選ぶ

図 1:回答者が1つ選ぶ(ここではAのドア)
 ( ・ω・)― A  |×
              
            B  |◎
              
            C  |×

そこで、司会者がゲームを盛り上げる為に、残りの2つのうち1つを開けてしまう。 (司会者は答えを知っていて、もちろん「ハズレ」のドアを開ける)

図 2:司会者1つ開けちゃう(ここではCのドア)
( ;゜д゜)― A  |×
              
            B  |◎
              
            C _ × (司会者が開けた)

ここで司会者は「一度だけ選択を変更するチャンスを与えちゃんす!」とか叫ぶ。 要するに現在、自分の選んだドアを含め2つのドアが残っているが、 今なら他方のドアに変更してもいいぞ、という事らしい。 どーする?変える?変えない?

どーすかね?普通に考えると、「どっちでも同じ」だと思いませんか? 俺もそう思いました。残り2つになったんだから、どっち選んでも1/2の確率だし。

が、違うんだそうです。答えは「変えるべき」です。 しかも、「どっちを選んでも1/2の確率」を言うのも間違いです。 この場合、回答者が選択を変更しなかった場合、当たる確率は1/3なんです。 この答えを聞いて、俺は 「まあ、そうか。選んだ時点では1/3だった訳だから司会者がその後、 何をしたとしてもどのドアも全部1/3の確率のままか。」 と、思ったんですが、それも間違いでした。 回答者が選択を変更した場合、当たる確率は2/3なんです。

なんでやねん。んーーー、全然分かりませんな。 こーゆーのを「条件付確率」と言うそうで、上記のゲームは実話らしく、 しかも、実際に選択を変更した人の方がしなかった人に比べて賞金の獲得率は2倍だったそうです。

で、分からない時はプログラムにしてみよー、と言う事で作ってみた。

filemontyhall.vbs(クリックでダウンロード可)

Option Explicit

Const DOOR_COUNT      = 3      'ドアの数
Const CHALLENGE_TIMES = 100000 '実験回数
Const CHANGE_DECIDE   = False  '選択を変更するか

Dim intSuccess  '賞金を獲得できた回数
Dim i           'ループ用

'指定回数、賞金獲得ゲームを行う
For i = 1 To CHALLENGE_TIMES
  If GetPrize(CHANGE_DECIDE) Then intSuccess = intSuccess + 1
Next

'結果表示
WScript.Echo ((intSuccess / CHALLENGE_TIMES) * 100) & _
             "% (" & intSuccess & "/" & CHALLENGE_TIMES & ")"

'賞金獲得ゲームを行う
Function GetPrize(blnSwitch)
  Dim intAnswer       '正解のドア番号
  Dim intMySelect     '回答者が選んだドア番号
  Dim intMontySelect  '司会者が残したドア番号(これ以外は開けちゃう)
  Dim i               'ループ用
  
  Randomize           '乱数初期化
  
  '正解、回答者の選択をランダムに決定
  intAnswer   = CInt(Int((DOOR_COUNT * Rnd()) + 1))
  intMySelect = CInt(Int((DOOR_COUNT * Rnd()) + 1))
  
  '司会者が1つを残してハズレのドアを開ける
  '(回答者の選んだドアと合わせて合計2つまでドアを絞り込む)
  'つまり、
  ' - 回答者がハズレを選んでいたら正解のドアを選択
  ' - 回答者が当たりを選んでいたら適当にどれか1つを選択
  If intAnswer <> intMySelect Then
    '正解のドアを残す
    intMontySelect = intAnswer
  Else
    'ドアの中から、
    ' - 正解のドアではなく、
    ' - 且つ、回答者の選んだドアではない
    'ドアをランダムに1つ選択する(正しく選択されるまでループ)
    Do
      intMontySelect = CInt(Int((DOOR_COUNT * Rnd()) + 1))
    Loop Until (intMontySelect <> intAnswer And _
                intMontySelect <> intMySelect)
  End If
  
  '選択を一度だけ変更可能
  If blnSwitch Then
    intMySelect = intMontySelect  '回答者の選択を司会者が残したドアに変更
  End If
  
  '正解のドアと回答者の選択ドアが同じかを返す
  GetPrize = (intMySelect = intAnswer)
End Function

ドアが3つの賞金獲得ゲームを10万回やったときの平均成功回数を計算するプログラムです。 デフォルトは選択を変更しない初志貫徹パターン。実行してみると、

D:\>cscript montyhall.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

33.191% (33191/100000)

と、言う事で、これはまあ、期待通りに1/3。 で、プログラム5行目の CHANGE_DECIDETrue に変更して 「選択を途中で変更する」パターンで実行してみると、、、

D:\>cscript montyhall.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

66.493% (66493/100000)

なんと、本当に2/3の確率で成功してます。プログラムの計算結果からも 「回答者は司会者の提案に従って選択を変更すべきだ」と言う事が証明されました。

このプログラム、ドアが3個以上だった場合にも対応しています。 と、言う事で、カモン!はなまるボックス!!
選択肢が、「は」「な」「ま」「る」「はなまるクン」の5つで 当たりは1つだった場合についてもやってみましょう。 (この場合、司会者は回答者が1つ選んだ後に、3つのハズレドアを開く事になります。 つまり、ドアが何個であろうと、最後は必ず二択になるようにしています)

初志貫徹パターン

D:\>cscript monty.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

20.359% (20359/100000)

選択変更パターン

D:\>cscript monty.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

79.786% (79786/100000)

と、言う事で更に差が開いてしまいました。つまり、初志貫徹した場合は、 確率的にはそのまま変わらず、残りの確率は全て変更した場合の確率に割り当てられる事になります。

まあ、プログラム作っているうちに、そりゃ当たり前だよなー、と思っちゃったんですが、 要するに司会者はハズレのドアを消してくれる機能を持っているんですが、 自分の選んだドアは対象外な訳です。 つまり、自分がハズレのドアを選択した場合、司会者が残した他方のドアは必ず当たりな訳です。 ドアが5個だった場合、自分が最初に偶然当たりを選択する確率は1/5、 逆に言うと、最初にハズレをひく確率は4/5な訳です。 ゆえに、選択を変えれば4/5の確率で当たりを引く事ができるわけです。

どうでしょうか。細かく説明されると何となく分かりますが、直感的には非常に分かりにくいですよな。 この場合、司会者の行動が「回答者の選択後」に行われる事が重要で、 例えば、最初に司会者が3つあるドアから1つだけハズレのドアを開けてしまってから 回答者がドアを選択する場合は、単純に確率は1/2になってしまいます。

みのもんた大活躍の「クイズ$ミリオネア」と言う番組で、 回答者側のお助けアイテムとして4択を2択にする「50:50」と言うアイテムが ありますが、もし、仮にこのアイテムが自分が答えを選んだ後(もちろんファイナルアンサー前)に使えるとすると、 それは「50:50」ではなく「25:75」になるっつーことです。

こーゆーの、認知心理学って言うんだそうです。興味深いっすな。

filemontyhall.vbsはダウンロードしてダブルクリックするだけで実行できますので、 ヒマな方は試してみてください。(編集もメモ帳でできます)



URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White