|
以下のサブルーチンは野球の1イニングの攻撃を擬似的に再現したものです。
RunXのXはランナーの状態を表し、ランナーなしならRun0=1,その他は0
ランナー一三塁ならRun13=1,その他は0という具合になっています。
MatAは9人の打者のパラメーターが入力されている9×6の二次元配列です。
1列に打席、2列に単打、3列に二塁打、4列に三塁打、5列に本塁打、6列に四死球の数が入力されています。乱数Bat>単打/打席なら単打、(単打+二塁打)/打席>Bat>単打/打席なら二塁打という具合に場合分けして、アウト3つになったらイニング終了となります。
このサブルーチンをForループで回してみたところ、どうも単打と四死球が本来の確率よりもかなり高い確率で発生しているようです。この状況をどうにかして改善したいのですが、問題がどこにあるかがわかりません。
糞長いので以下略しましたが、必要ならサブルーチン全体も書きます。アドバイスどうかよろしくお願いします。
Sub Batting(Run0 As Integer, Run1 As Integer, Run2 As Integer, Run3 As Integer, Run12 As Integer, _
Run13 As Integer, Run23 As Integer, Run123 As Integer, MatA() As Double, Score As Long, i As Long)
Dim Out As Integer, Bat As Double
Out = 0
Do
Bat = Rnd()
If Run0 = 1 Then 'ランナーなし
If Bat < MatA(i Mod 9 + 1, 2) / MatA(i Mod 9 + 1, 1) Then
Run0 = 0
Run1 = 1
ElseIf Bat < (MatA(i Mod 9 + 1, 2) + MatA(i Mod 9 + 1, 3)) / MatA(i Mod 9 + 1, 1) Then
Run0 = 0
Run2 = 1
ElseIf Bat < (MatA(i Mod 9 + 1, 2) + MatA(i Mod 9 + 1, 3) + MatA(i Mod 9 + 1, 4)) / MatA(i Mod 9 + 1, 1) Then
Run0 = 0
Run3 = 1
ElseIf Bat < (MatA(i Mod 9 + 1, 2) + MatA(i Mod 9 + 1, 3) + MatA(i Mod 9 + 1, 4) _
+ MatA(i Mod 9 + 1, 5)) / MatA(i Mod 9 + 1, 1) Then
Score = Score + 1
ElseIf Bat < (MatA(i Mod 9 + 1, 2) + MatA(i Mod 9 + 1, 3) + MatA(i Mod 9 + 1, 4) _
+ MatA(i Mod 9 + 1, 5) + MatA(i Mod 9 + 1, 6)) / MatA(i Mod 9 + 1, 1) Then
Run0 = 0
Run1 = 1
Else
Out = Out + 1
End If
End If
If Run1 = 1 Then 'ランナー一塁
If Bat < MatA(i Mod 9 + 1, 2) / MatA(i Mod 9 + 1, 1) Then
Run1 = 0
Run12 = 1
------------以下略(満塁までの全ての状況を場合分けしている)
Out = Out + 1
End If
End If
i = i + 1
Loop While Out <= 2
Run0 = 1
Run1 = Run2 = Run3 = Run12 = Run13 = Run23 = Run123 = 0
End Sub
|
|