これを使って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
となる。
今、打撃確率が同じチーム同士で試合して、引き分けになるのは
総試合数、k点取った試合数を用いて
と書けて、
> 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。サンクス。