【シミュレーション】サイコロの出た目の和が素数になる確率
複数のサイコロを振って出た目の和が素数になる確率を、エクセルVBAでシミュレーションしました!
サイコロ 2 個の場合
サイコロ 2 個の場合で、出た目の和が素数になる確率を計算してみましょう。出た目をそれぞれ a, b として、下のような表を書くと分かりやすいです。
黄色く塗った部分が素数ですので、その確率は
となります。
シミュレーション:サイコロ 2 個の場合
サイコロ2個を振って、出た目の和が素数となる確率をシミュレートした結果を示します。
試行回数を大きくすると、確率が 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 個まででシミュレートした結果が下のグラフです。
極大・極小を繰り返しながら、緩やかに逓減する曲線が得られました!
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
エクセルファイル
今回使用したエクセルファイルです。
―――――記事はここまで―――――
ありがとうございました!