見出し画像

【シミュレーション】サイコロの出た目の和が素数になる確率

複数のサイコロを振って出た目の和が素数になる確率を、エクセルVBAでシミュレーションしました!

サイコロ 2 個の場合

サイコロ 2 個の場合で、出た目の和が素数になる確率を計算してみましょう。出た目をそれぞれ a, b として、下のような表を書くと分かりやすいです。

画像1

黄色く塗った部分が素数ですので、その確率は 

画像2

となります。

シミュレーション:サイコロ 2 個の場合

サイコロ2個を振って、出た目の和が素数となる確率をシミュレートした結果を示します。

画像3

画像4

dice_prime_number_two_graph_有効桁数

試行回数を大きくすると、確率が 41.6.....% に収束してく様子をみることができました!

VBAコード:サイコロ 2 個の場合

まず、与えられた引数が素数かどうかをブール値で返す関数です。

Function isPrimeNumber(givenNumber As Long) As Boolean
   Dim i As Long
   Dim sqrtNumber As Long
   
   sqrtNumber = Int(Sqr(Abs(givenNumber)))
   
   Select Case givenNumber
       Case 0, 1
           GoTo return_false
       Case 2
           GoTo return_true
       Case Else
           For i = 2 To sqrtNumber
               If givenNumber Mod i = 0 Then
                   GoTo return_false
               End If
           Next i
   End Select

return_true:
   isPrimeNumber = True
   Exit Function

return_false:
   isPrimeNumber = False
End Function

下記がサイコロ 2 個の場合のシミュレーションのコードです。

Sub twoDice()
   Dim row As Long
   Dim n As Long
   Dim i As Long
   Dim count As Long
   Dim sum As Long
   
   row = 3
   Do While Cells(row, 2) <> ""
       n = Cells(row, 2).Value
       count = 0
       
       For i = 1 To n
           sum = WorksheetFunction.RandBetween(1, 6) + WorksheetFunction.RandBetween(1, 6)
           If isPrimeNumber(sum) Then
               count = count + 1
           End If
       Next i
       
       Cells(row, 3).Value = count / n
       
       row = row + 1
   Loop
End Sub

一般化:サイコロ n 個の場合

サイコロの個数を拡張しましょう。
n 個のサイコロを振って、出た目の和が素数となる確率を理論的に解くのは至難の業ですので、ここはモンテカルロ法の力を使います。
試行回数は100万回で、サイコロ 1 個から 100 個まででシミュレートした結果が下のグラフです。

画像6

極大・極小を繰り返しながら、緩やかに逓減する曲線が得られました!

VBAコード:サイコロ n 個の場合

Sub nDice()
   Const MAX_COUNT As Long = 1000000 ' 試行回数 '

   Dim row As Long
   Dim n As Long
   Dim i As Long
   Dim j As Long
   Dim count As Long
   Dim sum As Long
   
   row = 3
   Do While Cells(row, 2) <> ""
       n = Cells(row, 2).Value ' サイコロの数を代入 '
       count = 0
       
       For i = 1 To MAX_COUNT
           sum = 0
           For j = 1 To n
               sum = sum + WorksheetFunction.RandBetween(1, 6)
           Next j
           
           If isPrimeNumber(sum) Then
               count = count + 1
           End If
       Next i
       
       Cells(row, 3).Value = count / MAX_COUNT
       
       row = row + 1
   Loop
End Sub

エクセルファイル

今回使用したエクセルファイルです。

―――――記事はここまで―――――
ありがとうございました!

いいなと思ったら応援しよう!