2008/05/06

モンティ・ホール問題

まずはこちらの問題を見てほしい。

この模範的な回答「開けるドアを変更する」の意味がわからなかった。ホストがドアを開けた後だろうと、前だろうと結果かわんないんじゃないの? というわけで、pythonで検証スクリプトを書いてみた

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import random

all_count = 0
a_count = 0
b_count = 0
c_count = 0


#10万回施行
for x in range(100000):

#正解を決める
    ans =random.choice([1,2,3])

#タイプA: ランダムに回答を選ぶ
    aans = random.choice([1,2,3])

#違うドアを1つえらぶ(正解のドアではなく、Aの答えのドアでもない)
    pseudo_doors = [1,2,3]
    pseudo_doors.remove(ans)
    if( ans != aans):
        pseudo_doors.remove(aans)
    pseudo_door = pseudo_doors.pop()

#タイプB: 違うドア以外をランダムに選ぶ
#(Aと同じになるかもしれないし、違うかもしれない)
    next_door =  [1,2,3]
    next_door.remove(pseudo_door)
    bans = random.choice(next_door)

#C: 違うドア以外でAと違う回答を選ぶ(模範回答)
    next_door =  [1,2,3]
    next_door.remove(pseudo_door)
    next_door.remove(aans)
    cans = next_door.pop()

#あたっているかカウント
    all_count = all_count + 1
    if( aans == ans ):
        a_count = a_count + 1
    if( bans == ans ):
        b_count = b_count + 1
    if( cans == ans ):
        c_count = c_count + 1

#結果表示
print "施行回数   A   B   C"
print all_count , a_count , b_count  ,c_count

で、実行結果はこちら

$ monty_hall.py
施行回数   A   B   C
100000 33403 49870 66597

実行毎に微妙に数はずれるけど、だいたい、タイプAは1/3、タイプBは1/2、タイプCは2/3 の確率になる。

A+Cはかならず全体の施行回数になる。考えてみればあたりまえで、ホストが途中で一つの扉を開けることで、Cの「開けるドアを変更する」っていうのは、Aが外れる確率とまったく同じことになる。だから、模範的な回答になるのね。納得できた。

[]