Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4102 / 13644 ツリー ←次へ | 前へ→

【58411】野球シミュレーターを作ったけど…… shota 08/10/24(金) 1:07 質問[未読]
【58418】Re:野球シミュレーターを作ったけど…… ハチ 08/10/24(金) 13:42 発言[未読]
【58422】自己解決しました shota 08/10/24(金) 21:40 お礼[未読]

【58411】野球シミュレーターを作ったけど……
質問  shota  - 08/10/24(金) 1:07 -

引用なし
パスワード
   以下のサブルーチンは野球の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

【58418】Re:野球シミュレーターを作ったけど……
発言  ハチ  - 08/10/24(金) 13:42 -

引用なし
パスワード
   ▼shota さん:

内容はあまり読んでませんので勘ですが、

>Do

Randomize

> Bat = Rnd()
> If Run0 = 1 Then 'ランナーなし

で、どうですか?

【58422】自己解決しました
お礼  shota  - 08/10/24(金) 21:40 -

引用なし
パスワード
   >End If

ElseIf Run1 = 1 Then 'ランナー一塁
 
>If Bat < MatA(i Mod 9 + 1, 2) / MatA(i Mod 9 + 1, 1) Then
こんな感じでIfをElseIfに直していったら上手くいきました。

ハチさんレスありがとうございます。
Randomizeのことは知りませんでした。
今回の問題の原因ではありませんでしたが、
これはこれで凄く有益なアドバイスでした。

4102 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free