お知らせ

ただいま、シンタックスハイライターの設定を見直しております。
プログラムが見にくくなっているページがありますが、ご容赦ください。

モンティ・ホール問題をExcelでシミュレーションしてみる

モデル化とシミュレーション

こんにちは。今回はモンティ・ホール問題というものを扱ってみたいと思います。

モンティ・ホール問題とは

モンティ・ホールという人が司会をする番組のゲームが数学的に話題になったものです。そのゲームとは、A・B・Cの3つのドアがあり、そのドアの向こうにはヤギ・ヤギ・車が入っています。

 

司会とプレイヤーは次のようなやり取りをします。

  1. プレイヤーはA・B・Cのいずれかのドアを選択する
  2. 司会はプレイヤーが選ばなかったドアの中からヤギが入っているドアを開ける
  3. 司会はプレイヤーにドアを変更してもよいと必ず告げる
  4. プレイヤーは開いていない2つのドアのいずれにするかを選択する
  5. そのドアに車が入っていれば車をもらえる

と概ねそのような問題です。(と書くために調べましたが、数学的な考察の方に関心があるためか、サイトごとにディテールが若干違っているように思いました)

4番の時点で、プレイヤーがドアを変えなくても変えても車が当たる確率は\(\frac{1}{2}\)と考えられそうです。しかし実際の確率は、ドアを変更した場合には\(\frac{2}{3}\)、ドアを変更しなかった場合には\(\frac{1}{3}\)になるのです。これが論争になり、さまざまな説明が考えられました。条件付き確率を考えたり、ベイズの定理を使ったり、ドアの枚数を100枚とした場合から連想したり、プログラムでシミュレーションしたり、検索すれば多様な説明を見つけることができると思います。あえて、その一つの方法として、Excelでシミュレーションしてみようと思います。

Excelでシミュレーション

次のように列ごとに式を立てていきます。計算しやすいようにドアA・ドアB・ドアCと呼ばないで、ドア1・ドア2・ドア3と数字でドアを表記することにします。

数式はSheetの4行目に入力するものとして説明します。

A列:車が入っているドアを乱数で決定する。ドア1~ドア3まであるので、次の式になります。

=randbetween(1,3)

B列:プレイヤーが最初に選択するドアを乱数で決定する。本当は好まれる数字というように偏りがあるのかもしれませんが、単純に乱数で決めることにします。そのため、この列も次の式で求められます。

=randbetween(1,3)

C列:司会がドア1を開けられるかどうかを判定する。司会は車が入っているドアを開けることはできません。また、プレイヤーが選択しているドアを開けることもできません。いずれにも当てはまらない場合は、開けることができます。開けられる場合にはドアの番号の1を表示し、開けられない場合には空文字としておきます。

=IF(AND(A4<>1,B4<>1),"1″,"")

D列:司会がドア2を開けられるかどうかを判定する。C列と同じ考え方で次の式が得られます。

=IF(AND(A4<>2,B4<>2),"2″,"")

E列:司会がドア3を開けられるかどうかを判定する。C列と同じ考え方で次の式が得られます。

=IF(AND(A4<>3,B4<>3),"3″,"")

F列:C列・D列・E列の結果をもとに司会が開けることができる列をつないで文字列を作ります。

=C4&D4&E4

G列:司会が開けるドアを決めます。司会が開けることができるドアの数が1つの場合と2つの場合があるので、LEN(F4)でドアの数を文字列の長さから取得しています。MID関数を使って、F列で求めた開けられるドアの番号から1つ(1文字)選択します。ここで得られたドアの番号が、司会が開けるドアになります。

=MID(F4,RANDBETWEEN(1,LEN(F4)),1)

H列:プレイヤーがドアを変更する場合について、どのドアに変更するかを求めます。すべてのドア番号"123″という文字列から、最初に選択したドア番号と司会が開けてしまったドアに変更することはできません。そのため、変更できないドア番号を空文字に置換することにより、残った文字が変更できるドア番号になります。数式では、次になります。

=SUBSTITUTE(SUBSTITUTE(“123″,B4,""),G4,"")

I列:変更した場合に当たったかどうかを判定しています。H4*1と1を掛けているのは、文字列としての"1″を数値としての1に変換して、数値どうしの比較ができるようにするためです。括弧の外側で1を掛けているのは、TRUE*1は1になり、FALSE*1は0になることを使って、当たった回数の合計をSUM関数で求められるようにするためです。

=(A4=H4*1)*1

J列:変更しなかった場合に当たったかどうかを判定しています。括弧の外側で1を掛けているのは、I列と同様の理由です。

=(A4=B4)*1

今回は10000回シミュレーションしてみたいと思います。数式を9999行コピーすることで同じ式を10000行分作ります。

シミュレーションの結果

乱数で求めているので、多少の数値の幅はありますが

変更して当たる確率   0.6672

変更しないで当たる確率 0.3328

と、変更した場合には約\(\frac{2}{3}\)、変更しない場合には約\(\frac{1}{3}\)になることが示されます。作成したExcelファイルもアップしておきます。

Monty_Hall_problem

ドアの枚数が9枚までならば、ほとんど同じようにシミュレーションできます。

シミュレーションの意義

シミュレーションをやってみたら、理屈はわからないけれど値が求まったという感じでモヤモヤするかもしれません。

シミュレーションの意義は2つあると考えています。1つ目は、直観では確率は半々と思われる事象について直観とは異なっていることを確かめ問題を発見することに有用であること、2つ目は、理屈はなくても構わないので近似値が得られれば十分な場合に問題を解決するための方法となり得ること。

コンピュータを思考の道具とするためには、シミュレーションやプログラミングをすることは重要な要素だと思います。

ということで、今回はおしまいにします。次回は未定ですが、モンティ・ホール問題をプログラムを用いて確率を求める機会をいずれ設けたいと思います。それではまた。

この記事を書いた人
春日井 優

高校で情報科という教科を担当しています。以前は数学科も担当していました。(今でも数学科の教員免許状は有効です。)プログラムを覚えたのは、「ゲームセンターあらし」という漫画のキャラクターがBASICを解説する「こんにちはマイコン」を読んだことがきっかけでした。

Posted by kasugai