モンティホール問題のモンテカルロシミュレーションをExcel VBAと高速メルセンヌツイスタで。
モンティ・ホール問題というのがある。
Wikipediaを引用すると、、、
「プレイヤーの前に3つのドアがあって、1つのドアの後ろには景品の新車が、2つのドアの後ろにはヤギ(はずれを意味する)がいる。プレイヤーは新車のドアを当てると新車がもらえる。プレイヤーが1つのドアを選択した後、モンティが残りのドアの内ヤギがいるドアを開けてヤギを見せる。ここでプレイヤーは最初に選んだドアを、残っている開けられていないドアに変更しても良いと言われる。プレイヤーはドアを変更すべきだろうか?」
と言う話。実は変えた方が当たる確率が2倍になる、、、というのはなかなか直感に反する話。ではシミュレーションで見てみよう。
でコードは、、、
Rosetta Codeというサイトがあって、さまざまな問題をさまざまなプログラム言語で書いてる。これすごいな。
そこのMonty Hall Problemを見てみると、
http://rosettacode.org/wiki/Monty_Hall_problem
まあ、Excel VBAに対応するにはBASICを移植するのが簡単だろう。しかし乱数はちゃんといいやつを使おう。↓で使ったものを再度使ってみた。
メルセンヌツイスタの高速版(SFMT)がExcel VBAで簡単に使える!
で、試行回数を10~10^6まで、乱数の種を100個変えてシミュレーションしてみた。
こんな感じ(点線は乱数の種を変えた時のMIN/MAX)。
本当だ!変えた時の方が2/3、変えないと1/3になる!
コードはこんな感じ。Rosetta Codeはまだまだ見て行ってみよう。
Option Explicit
Private Sub 実行_Click()
Dim s As Integer
Dim total As Long, switchWins As Long, stayWins As Long
Dim plays As Long
Dim doors(3) As Integer
Dim winner As Integer, choice As Integer, shown As Integer
Dim i As Integer
total = 1000
s = 1
Call InitMt(s)
switchWins = 0
stayWins = 0
For plays = 1 To total
doors(1) = 0
doors(2) = 0
doors(3) = 0
winner = NextInt(3) + 1
doors(winner) = 1
choice = NextInt(3) + 1
For i = 1 To 3
If i <> winner And i <> choice Then
shown = i
Exit For
End If
Next i
If doors(choice) = 1 Then
stayWins = stayWins + 1
Else
switchWins = switchWins + 1
End If
Next plays
Worksheets("Sheet1").Cells(2, 4) = stayWins
Worksheets("Sheet1").Cells(2, 5) = switchWins
End Sub
« ”九十九十九”(舞城王太郎)を読んだ。 | トップページ | 「グレイブディッガー」を読んだ。 »
「学問・資格」カテゴリの記事
- 高周波・RFニュース 2026年1月20日 高周波回路シミュレータuSimmics(旧名QucsStudio)がv5.9にバージョンアップ、Keysightがデバイスモデリングに機械学習ツールキットを、アンリツとVTTがDバンド高速通信、GPUを利用したアンテナシミュレーション(2026.01.20)
- 令和8年(2026年)大学入学共通テスト「情報」に出てきた日本語プログラム言語の問題、文化祭のゲームの待ち時間をPythonに直して実行するDNCL2Pythonを使って確認した。(2026.01.18)
- RF Weekly Digest (Gemini 3 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ) 2026/1/11-2026/1/18(2026.01.18)



コメント