11/22 プログラミングセミナー その2

今まではシミュレーションにより、何万回も試行して得点を出して、度数分布図を描いていた。
今度は、バッターに打率を与えたらx点はpの確率で取ります、とバシッと出しにかかりたい。
ヒットが永遠に続く(ことはまあ無いだろうけど)ことを考えて、とりあえずあり得ないとみなせるくらいの確率の連続ヒットは除外しようということを前に書いた。

Vnum    <- 1000   # the number of batters
Nout.num<- 20     # the number of outs
hitp    <- 9      # hit probability
A<- array(0,c(Vnum,Nout.num,hitp))        # Vnum行Nout列の行列をp個作る。
for(p in 1:hitp){
  for(v in 1:Vnum){
    for(Nout in 1:Nout.num){
# 最後のバッターは必ずアウト。Vnum-1人のうちNout - 1人がアウト。
      A[v,Nout,p]<- choose((v - 1),(Nout - 1))*(0.1*p)^(v - Nout)*(1 - 0.1*p)^(Nout - 1)*(1 - 0.1*p)
    }
  }
}
cumsum.p<- array(0,c(Vnum,Nout.num,hitp))
for(i in 1:hitp){
  cumsum.p[,,i]<- apply(A[,,i],2,cumsum)      # ヒットを打つ確率pのとき、回ってくるバッター数の加算確率。
}
cut.off<- matrix(0,Nout.num,hitp)             # 加算確率がある程度超えたら終了とする。この時の最小打者数。
for(p in 1:hitp){
    for(Nout in 1:Nout.num){
      cut.off[Nout,p]<- min(which(cumsum.p[,Nout,p]>0.9999))
    }
}
dimnames(cut.off) <- list(1:20, (1:9)/10)
names(dimnames(cut.off)) <- c("Out", "Hit probability") 
cut.off
    Hit probability
Out  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
  1    5   6   8  11  14  19  26  42  88
  2    6   8  11  14  18  24  34  54 113
  3    8  10  13  17  22  29  41  64 134
  4    9  12  15  20  25  33  47  73 153
  5   11  14  18  22  28  37  52  82 171
  6   12  16  20  25  31  41  58  91 189
  7   13  17  22  27  34  45  63  99 206
  8   15  19  24  29  37  49  69 107 222
  9   16  21  25  32  40  53  74 115 238
  10  18  22  27  34  43  57  79 123 254
  11  19  24  29  36  46  60  84 130 269
  12  20  25  31  39  49  64  88 137 284
  13  21  27  33  41  51  67  93 145 299
  14  23  28  35  43  54  71  98 152 314
  15  24  30  37  45  57  74 103 159 329
  16  25  31  38  47  60  78 107 166 343
  17  27  33  40  49  62  81 112 173 357
  18  28  34  42  52  65  84 116 180 372
  19  29  36  44  54  67  88 121 187 386
  20  30  37  45  56  70  91 125 194 400

行と列に名前をつけてみたよ。
見方を書かないと忘れる、というのは前も同じ。
例えば、Out=3、Hit probability=0.4のところをみると、17。
これは、17人まで考えれば、99.99%をカバーしている、ということになる。
これ以降の計画は
・考えられうる打撃パターンをすべて発生させる。
・決めたアウト数に満たない打撃パターンを排除する。
・打撃パターンに対応する得点を計算し、確率もくっつける。
・ヤホ-イ(・∀・)
という感じのごり押しでいこうと思う。
ただしこれでは、打者が複数いるときのは考えられない?にくい?ので、まあこれがうまくいったら考えようじゃないか。
                       __  ,、へ
                 _.._  ,、 '": : : : : : : : Y/、i: :\
                i:::〆 : : : : : : : : : : : く〈: : l: : : :ヽ
                /: : : : : : : : : : : : : :ヽ: : : : ::l: : : : ヽ
                  / /: : i: : : : : : : : : : : : : l、: : : : l: : : : : :',
いいんじゃないかな   /:./: : :.lヽ: : lヽ: : : : : : : : L:.:.: : : l: : : : : : ,
                 /:./l: : : :l..._\V゛\: : : : : :l:::::::ヽ: :l: : : : : : i
              l:./: l: : : :L..  ヽ /l::\: : :.l::::::::::l: ∧: : : : : :l
               /l/: : ',: : :.| l::ヽ   ヽ-'ヽ: ト:::://  ',: : : : : l
                /:.l': : : ヽ: :.l l`" 、     |:.l: : :/   i: : : : : l
           /: : : : : : : 〉: l ヽ  -‐'   ィ:./Tく.     l: : : : : l
           /: : : : : : :./ `.j   > -r '゛l/_.ハヽj    l: : : : : l
           / : : : : : : /     `rr┴ '"::::::::/>--、    l: : : : : l
           /: : : : : : :/   _.. r '"Hヽ:::::::::::::/     ヽ.   l: : : : : l
           /: : : : : : :/  r'"  レ'/^/::ヽ:::::/     i.  l: : : : : l
          /: : : : : : /  l  /:::/ ./::::::::::Y  i.    /    !: : : : :.l
         /: : : : : :./   j /:::::::/ ./::::::::::::::l.  l. 01 ,'     !: : : : :.l
        / : : : : : /   ノ l:::::,:' /::::::::::::::::::',. l    l     l: : : : : l
        /: : : : : :/  ./;;:ソ::/ ./::::::::::::::::::::::ヽr‐---‐ト,    l: : : : : l
        /: : : : : :/   /;;;:/::/ ./::::::::::::::::::::::::::::|:;;;;;;;;;;;;;;リ     l: : : : : l