一回のグリコの勝率

バグ取りして修正してみた。

N<-10 #ジャンケンする回数
library(gtools)
#とりあえず全通り出す
cmb<- combinations(5,N,repeats.allowed=T)
num<- nrow(cmb)
#A→1、B→2、C→3、D→4、E→5 と変換
ABCDE.count<- matrix(rep(0,5*nrow(cmb)),nc=5)
for(i in 1:num){
for(k in 1:N){
if(cmb[i,k]==1){ABCDE.count[i,1]<- ABCDE.count[i,1] + 1}
else if(cmb[i,k]==2){ABCDE.count[i,2]<- ABCDE.count[i,2] + 1}
else if(cmb[i,k]==3){ABCDE.count[i,3]<- ABCDE.count[i,3] + 1}
else if(cmb[i,k]==4){ABCDE.count[i,4]<- ABCDE.count[i,4] + 1}
else {ABCDE.count[i,5]<- ABCDE.count[i,5] + 1}
} #for.k end
} #for.i end


gain<- matrix(c(rep(2,nrow(cmb)),rep(1,nrow(cmb)),rep(-1,nrow(cmb)),rep(-2,nrow(cmb)),rep(0,nrow(cmb))),nc=5)
step<- gain*ABCDE.count

#勝ちパターンだけとってくる行列
win.pattern<- matrix(rep(0,5),nc=5)
for(j in 1:num){
if(sum(step[j,])>0){
win.pattern<- rbind(win.pattern,ABCDE.count[j,])
}
} #for.j end
win.pattern<- win.pattern[c(-1),]

#負けパターン
lose.pattern<- matrix(rep(0,5),nc=5)
for(j in 1:num){
if(sum(step[j,])<0){
lose.pattern<- rbind(lose.pattern,ABCDE.count[j,])
}
} #for.j end
lose.pattern<- lose.pattern[c(-1),]

#引き分けパターン
equal.pattern<- matrix(rep(0,5),nc=5)
for(j in 1:num){
if(sum(step[j,])==0){
equal.pattern<- rbind(equal.pattern,ABCDE.count[j,])
}
} #for.j end
equal.pattern<- equal.pattern[c(-1),]

library(MCMCpack)
p<- rdirichlet(1,c(1,1,1))
#p<- t(rep(1/3,3))
#p<- t(c(0,0,1))
q<- rep(1/3,3)
step.matrix<- rbind(c(0,3,-6),  #1回のじゃんけんでの相手からみた自分の変位
                    c(-3,0,6),
                    c(6,-6,0))
pq<- t(p) %*% q #pとqが出すグー、チョキ、パーの掛け合わせ確率
p
q
pq
a<- pq[3,1] + pq[2,3]
b<- pq[1,3]
c<- pq[2,2]
d<- pq[1,3] + pq[3,2]
e<- pq[1,1] + pq[2,2] + pq[3,3]

#勝ちパターンを足す
win.probability<- 0
for(m in 1:nrow(win.pattern)){
win.probability<- win.probability +
gamma(sum(win.pattern[m,])+1)/(gamma(win.pattern[m,1]+1)*gamma(win.pattern[m,2]+1)*
gamma(win.pattern[m,3]+1)*gamma(win.pattern[m,4]+1)*gamma(win.pattern[m,5]+1))*
a^win.pattern[m,1]*b^win.pattern[m,2]*c^win.pattern[m,3]*d^win.pattern[m,4]*e^win.pattern[m,5]
}

#負けパターンを足す
lose.probability<- 0
for(m in 1:nrow(lose.pattern)){
lose.probability<- lose.probability +
gamma(sum(lose.pattern[m,])+1)/(gamma(lose.pattern[m,1]+1)*gamma(lose.pattern[m,2]+1)*
gamma(lose.pattern[m,3]+1)*gamma(lose.pattern[m,4]+1)*gamma(lose.pattern[m,5]+1))*
a^lose.pattern[m,1]*b^lose.pattern[m,2]*c^lose.pattern[m,3]*d^lose.pattern[m,4]*e^lose.pattern[m,5]
}

#引き分けパターンを足す
equal.probability<- 0
for(m in 1:nrow(equal.pattern)){
equal.probability<- equal.probability +
gamma(sum(equal.pattern[m,])+1)/(gamma(equal.pattern[m,1]+1)*gamma(equal.pattern[m,2]+1)*
gamma(equal.pattern[m,3]+1)*gamma(equal.pattern[m,4]+1)*gamma(equal.pattern[m,5]+1))*
a^equal.pattern[m,1]*b^equal.pattern[m,2]*c^equal.pattern[m,3]*d^equal.pattern[m,4]*e^equal.pattern[m,5]
}
p;win.probability;lose.probability;equal.probability


#全パターン足すと1だよね
probability<- 0
for(m in 1:nrow(ABCDE.count)){
probability<- probability +
gamma(sum(ABCDE.count[m,])+1)/(gamma(ABCDE.count[m,1]+1)*gamma(ABCDE.count[m,2]+1)*
gamma(ABCDE.count[m,3]+1)*gamma(ABCDE.count[m,4]+1)*gamma(ABCDE.count[m,5]+1))*
a^ABCDE.count[m,1]*b^ABCDE.count[m,2]*c^ABCDE.count[m,3]*d^ABCDE.count[m,4]*e^ABCDE.count[m,5]
}
p;probability

いくつかやってみた結果

         [,1]      [,2]      [,3]
[1,] 0.3333333 0.3333333 0.3333333
#グチパ等確率
 win.probability;lose.probability;equal.probability
[1] 0.4559446
[1] 0.4559446
[1] 0.08811078
 
p;win.probability;lose.probability;equal.probability
#dirichlet at random
           [,1]      [,2]      [,3]
[1,] 0.05113552 0.6780277 0.2708368
[1] 0.6388502
[1] 0.2795594
[1] 0.08159043

p;win.probability;lose.probability;equal.probability
#グーばっかり
     [,1] [,2] [,3]
[1,]    1    0    0
[1] 0.1691477
[1] 0.7571678
[1] 0.07368457

p;win.probability;lose.probability;equal.probability
#チョキばっかり
     [,1] [,2] [,3]
[1,]    0    1    0
[1] 0.7571678
[1] 0.1691477
[1] 0.07368457

p;win.probability;lose.probability;equal.probability
#パーばっかり
     [,1] [,2] [,3]
[1,]    0    0    1
[1] 0.4241901
[1] 0.4241901
[1] 0.1516198

相手の手が等確率だったとき、期待値は自分のパーによらなかったから
これはいけてそう。
網羅的にp動かそうかな…
勝てるパターンの選択方法は変えていないので、大きくなるとだめです。
ここはまだ改良できそう。
 
Rは階乗が!ではないらしい

#n!
gamma(n+1)
#+1を忘れずに

終わり