【シミュレーション】ギャンブラーの破産確率
確率の有名問題「ギャンブラーの破産確率」について、エクセルとVBAを用いてシミュレーションしました。
「ギャンブラーの破産確率」概要
ギャンブラーの破産確率とは、以下のような設定の問題です。
初期設定:
ギャンブラーは初め n 点の持ち点を持っている。
試行:
試行1回につき、確率 p でギャンブラーの勝利、確率 1 - p でギャンブラーの敗北となる。
勝利すると持ち点に +1、敗北すると持ち点に -1する。
持ち点が 0 となると破産、N になると最終勝利とし、試行を止める。
問題:
ギャンブラーの破産する確率は?
漸化式を利用して解く方法は以下のサイトに詳しく解説されています。
シミュレーション
ここからはエクセルVBAを用いて、ギャンブラーの破産確率問題を数値的に解いてみましょう。
シミュレーションの概要:
試行1回あたりの勝利確率 p を変化させて、破産確率をシミュレートし、計算値と理論値を比較する。
なお、初期の持ち点は 4 、最終勝利となる得点は 6 としてシミュレーションを行った。
以下が結果を示した表とグラフです。
結論
おおむね有効桁数 2 程度の精度で、計算値と理論値が一致した!
エクセルとVBA全文
今回使用したエクセルは以下のファイルです。
下記はVBAの全文
Option Explicit
Const N As Long = 2000 ' シミュレートの回数 '
Dim startN As Integer
Dim maxN As Integer
Dim p As Double
Dim wallet As Integer
Dim count As Integer
Dim result As Double
Sub main()
Dim index As Long
Dim rowNumber As Long
Call init
rowNumber = 7
Do While Cells(rowNumber, 1) <> ""
p = Cells(rowNumber, 1).Value ' 試行の勝利確率の読み込み '
count = 0
For index = 1 To N
Call trial
If wallet = 0 Then
count = count + 1
End If
DoEvents
Next index
result = count / N
Cells(rowNumber, 1) = p
Cells(rowNumber, 2) = result
Debug.Print count, N, result
rowNumber = rowNumber + 1
Loop
End Sub
Sub init()
startN = Range("START") ' 初期の持ち点の読み込み '
maxN = Range("MAX") ' 最終勝利の得点の読み込み '
End Sub
Sub trial()
wallet = startN
Do While 0 < wallet And wallet < maxN
wallet = wallet + distortedCoin(p)
DoEvents
Loop
End Sub
Option Explicit
Public Function distortedCoin(ByVal p As Single) As Integer
Dim judge As Double
judge = Rnd
If judge < p Then
distortedCoin = 1
Else
distortedCoin = -1
End If
End Function
ーーーーー記事はここまでですーーーーー
最後まで読んで下さり、ありがとうございました!
続き書きました ↓
この記事が気に入ったらサポートをしてみませんか?