見出し画像

【シミュレーション】ギャンブラーの破産確率

確率の有名問題「ギャンブラーの破産確率」について、エクセルとVBAを用いてシミュレーションしました。

続き書きました!

「ギャンブラーの破産確率」概要

ギャンブラーの破産確率とは、以下のような設定の問題です。

初期設定:
ギャンブラーは初め n 点の持ち点を持っている。
試行:
試行1回につき、確率 p でギャンブラーの勝利、確率 1 - p でギャンブラーの敗北となる。
勝利すると持ち点に +1、敗北すると持ち点に -1する。
持ち点が 0 となると破産、N になると最終勝利とし、試行を止める。
問題:
ギャンブラーの破産する確率は?

漸化式を利用して解く方法は以下のサイトに詳しく解説されています。

シミュレーション

ここからはエクセルVBAを用いて、ギャンブラーの破産確率問題を数値的に解いてみましょう。

シミュレーションの概要:
試行1回あたりの勝利確率 p を変化させて、破産確率をシミュレートし、計算値と理論値を比較する。
なお、初期の持ち点は 4 、最終勝利となる得点は 6 としてシミュレーションを行った。

以下が結果を示した表とグラフです。

画像1

画像2

結論

おおむね有効桁数 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

ーーーーー記事はここまでですーーーーー
最後まで読んで下さり、ありがとうございました!
続き書きました ↓


この記事が気に入ったらサポートをしてみませんか?