モンティ・ホール問題をpythonで実装してみた

かぬです.
モンティ・ホール問題について実装したのでメモを残します.

モンティ・ホール問題の詳細については下記をご確認ください.
(かぬが解説するより詳細が載ってるので)

モンティ・ホール問題 – Wikipedia

意味や解釈などは追記していけたらと思っています.
私の学習時点でのメモなので,実装内容についての責任を持てません.
ご了承ください.

import random
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
sns.set_style('whitegrid')

#シミュレーションパラメータ
l = [0, 0, 1,]#選択肢,あたりが1として定義
triNum=1000 #一回のシミュレーションの試行回数
sessionNum=10#シミュレーションの繰り返し回数

#changeの時に必ず選択肢を変える,noChangeの時は最初の選択を維持し続ける
states= ['noChange','change']

fig,ax=plt.subplots(1,2,figsize=(10,5))#図の作成
d_c={'change':'red','noChange':'blue'}#図の色指定


# 計算
mean_state,std_state=[],[]
for state in states:
  prob_serieses,probs =[],[]
  for j in range(sessionNum):
    sum_n,prob_series=0,[]
    for i in range (triNum):
      c1=random.choice(l)
      if state=='change':
        if c1==0:
          c1=1
        elif c1==1:
          c1=0
      sum_n=sum_n+c1
      prob_series.append(sum_n/(i+1))
    prob_serieses.append(prob_series)
    probs.append(sum_n/triNum)
    ax[0].plot(prob_series,alpha=0.1,color=d_c[state])
  mean_state.append(np.mean(probs))
  std_state.append(np.std(probs))
  ax[0].plot(np.mean(prob_serieses,axis=0),alpha=1,color=d_c[state],label=state,lw=3)
ax[1].bar([0,1],mean_state,yerr=std_state,ecolor="black", capsize=10,color=['blue','red'],alpha=0.5,tick_label=states)

# 図の書式
ax[0].set_xlabel('Trial Num [-]')
ax[0].legend()
for a in ax:
  a.set_ylim(0,1,2)
  a.set_ylabel('Probability [-]')
plt.show()

実行すると,下記のように変更しなかった場合には1/3,変更した場合には2/3の確率で当たりを引くことができることがわかります.

それでは.

タイトルとURLをコピーしました