yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。

この記事は3年以上前に書かれた記事で内容が古い可能性があります

モンティホール問題実験してみた(python)

2020-01-05

この前忘年会で話題となった話
テレビ番組で最近やってたとか

いつかの就職試験で出た(もちろん外した)ので
私にとっても思い入れのある問題

ルールは以下

0:三つの扉がある。一つは正解(車の扉)。二つは不正解(山羊の扉)。
1:挑戦者は三つの中から一つ扉を選ぶ。
2:司会者(モンティ)は答えを知っており,残り二つの扉の中で不正解の扉を一つ選んで開ける。
3:挑戦者は残り二つの扉の中から好きな方を選べる。このとき扉を変えるべきか?変えないべきか?

参考リンク:
モンティ・ホール問題とその解説

直感だと、扉を変えても変えなくても確率は同じだけど

実際は変えた方が確率は上がるよね

と言う話

解説はこちらがわかりやすかった

【条件付き確率】全米が震えたモンティ・ホール問題を解説

一応、念の為、本当に確率が違うのかpythonで実験してみた

コードは以下

% cat montyhall.py
#!/usr/bin/env python
# coding: utf-8

import random
import copy

# try回数を決める
trycount = 10000

reward1 = 0 # 扉を変えなかった場合の初期値、正解したらこの値が増える
reward2 = 0 # 扉を変えた場合の初期値、正解したらこの値が増える

# 扉のリストを作る
doorsList = ['d1','d2','d3','d4','d5']
print('扉の数: %i' % len(doorsList))

for x in range(trycount):

  #print('==========')
  #print('%i 回目' % x)

  # ===========================
  # 準備
  # ===========================
  # car(正解)の扉を決める
  car = 'dummy' # 初期化
  car = random.choice(doorsList) # 扉からランダムに選ぶ
  #print('car: %s' % car)

  # 選択する扉を選ぶ
  choice = 'dummy'
  choice = random.choice(doorsList) # 扉からランダムに選ぶ
  #print('choice: %s' % choice)

  # 開かない(残す)扉を決める
  doorsListOpn = copy.copy(doorsList) # 開かない扉を決める用のリストを作る

  if car == choice: #  正解の扉と選んだ扉が一致していれば
    doorsListOpn.remove(car) # 正解の扉以外
    nopn = random.choice(doorsListOpn) # 正解の扉以外から、開かない扉を決める
  else: # 一致していなければ
    nopn = car # 正解の扉が開かない扉
  #print('nopn: %s' % nopn)


  # ===========================
  # 扉を変えない場合
  # ===========================
  if choice == car:
    reward1 += 1

  #print('reward1: %i' % reward1)


  # ===========================
  # 扉を変えた場合
  # ===========================
  if nopn == car:
    reward2 += 1

  #print('reward2: %i' % reward2)



print('扉を変えないで成功した場合の回数: %i' % reward1)
print('扉を変えて成功した場合の回数: %i' % reward2)
rate = float(reward2)/float(reward1)
print('変えなかった場合と比べて変えた場合の成功率: %f' % rate)

いざ、実行

% python montyhall.py
扉の数: 5
扉を変えないで成功した場合の回数: 1954
扉を変えて成功した場合の回数: 8046
変えなかった場合と比べて変えた場合の成功率: 4.117707
% python montyhall.py
扉の数: 5
扉を変えないで成功した場合の回数: 2010
扉を変えて成功した場合の回数: 7990
変えなかった場合と比べて変えた場合の成功率: 3.975124
% python montyhall.py
扉の数: 5
扉を変えないで成功した場合の回数: 1993
扉を変えて成功した場合の回数: 8007
変えなかった場合と比べて変えた場合の成功率: 4.017561

すごい、扉5枚の場合は4倍にちゃんとなる

youtubeで紹介されていた3枚扉にすると
ちゃんと2倍に落ち着く

% python montyhall.py
扉の数: 3
扉を変えないで成功した場合の回数: 3298
扉を変えて成功した場合の回数: 6702
変えなかった場合と比べて変えた場合の成功率: 2.032141
% python montyhall.py
扉の数: 3
扉を変えないで成功した場合の回数: 3356
扉を変えて成功した場合の回数: 6644
変えなかった場合と比べて変えた場合の成功率: 1.979738