2チームで試合するのだが大丈夫か?

これを使って9イニングのスコア分布を描いた。

10万回試合したとき、得点は

 u #0点、1点、…最高で22点でした
 [1] 15620 17983 17440 14927 11344  8155  5529  3526  2300  1382   783   431   278
[14]   153    77    35    23     7     4     1     0     1     1

となる。
今、打撃確率が同じチーム同士で試合して、引き分けになるのは
総試合数N、k点取った試合数N_{k}を用いて
\sum_{k}(\frac{N_{k}}{N})^2
と書けて、

> sum((u/100000)^2)
[1] 0.1340642
> sum((u/100000))   #確認
[1] 1

となる。引き分けは13%っぽい。今、

batter<-rbind(c(0.71,0.20,0.06,0.01,0.02),  #アウト、シングルヒット、ツーベース、スリーベース、HR
              c(0.71,0.20,0.06,0.01,0.02),
              c(0.71,0.20,0.06,0.01,0.02),
              c(0.71,0.20,0.06,0.01,0.02),
              c(0.71,0.20,0.06,0.01,0.02),
              c(0.71,0.20,0.06,0.01,0.02),
              c(0.71,0.20,0.06,0.01,0.02),
              c(0.71,0.20,0.06,0.01,0.02),
              c(0.71,0.20,0.06,0.01,0.02)
             )

という打撃確率をもつ同じチームが試合することを考える。
ある1チームが9イニングやるまでに何点取れるかをシミュレーションする関数を作る。

one.game.score<-
        function(batter){
          si  <- c(1)
          dou <- c(1,0)
          tri <- c(1,0,0)
          hr  <- c(1,0,0,0)
          total.score<- rep(0,9)
          batter.box<- 1
          for(t in 1:9){
            runner<- rep(0,9)
            out<- 0
            repeat{
              x<- sample(c(1,2,3,4,5),prob=batter[batter.box,],size=1)
              switch(x,
                     (out<- out + 1),
                     (runner<- append(runner,si)),
                     (runner<- append(runner,dou)),
                     (runner<- append(runner,tri)),
                     (runner<- append(runner,hr))
              )
              switch(batter.box,               #打順を回すのに
                     (batter.box<- 2),            #なんかいいのが思いつかなかった
                     (batter.box<- 3),            #swhitch大好きっ子
                     (batter.box<- 4),
                     (batter.box<- 5),
                     (batter.box<- 6),
                     (batter.box<- 7),
                     (batter.box<- 8),
                     (batter.box<- 9),
                     (batter.box<- 1)
              )
              if(out>2){
                break
              }
            }
            total.score[t]<- sum(runner[c(1:(length(runner)-3))])
          }
          return(sum(total.score))
        }

この前のディスカッションのテーマだった上限は作っていません。(1イニングの最大打席人数シミュレーションで、15人以上はなかったのでとりあえず今は後回し)
この後、2チームそれぞれで9イニングの得点を出し、比較する。

Games<-
function(batter1,batter2,trials){
  counter<- c(0,0,0)                      #win、draw、loseの順
  for(j in 1:trials){
     team1<- one.game.score(batter1)
     team2<- one.game.score(batter2)
     if     (team1 > team2)  counter[1]<- counter[1] + 1  #それぞれ対応するものを増やす
     else if(team1 == team2) counter[2]<- counter[2] + 1
     else                    counter[3]<- counter[3] + 1
   }
   return(counter)
}

10000試合を同じチームでの試合としてシミュレーションした結果

> Games(batter,batter,10000)
[1] 4364 1302 4334

引き分け13%でなんとか合っているっぽい。
引き分け確率が66%とかで確実バグだろうと思いました。
バグ取り協力NK。サンクス。