Rを用いてビンゴの確率について

ビンゴ(bingo)する確率について調べてみたけどあまりよくわからなかった。
とりあえず5×5でフリーマスありで、10000回(コードでは人数になってるけど)やってみた結果を添付します。
f:id:saikeisai:20170129184551p:plain

細かい結果を見てみると、mizutaの結果と少し異なり、
dinとほとんど同じ結果が得られた。
つまり、mizutaさんの式がどこか間違っているのだろうか。考えれば考えるほどわからなくなった。
論文では他に、"A New Look at the Probabilities in Bingo"Some Probability Problems Concerning the Game of Bingoなど読んだ。


コード中では3×3や、4×4などを任意に変えられるようにしました。freeマスは4×4などでは上手く行かないかも。


以下コード

players<-10000
numrows <- numcols <- 5
maxNum <- 75
isfree <- TRUE # free : center

all_bingo<-list()
numBingoMatrix <- matrix(0,nrow=maxNum,ncol=players)

countBingo <- function(bingo,numrows){
  #bingo bingo matrix
  count <- 0
  for(i in 1:numrows){
    if(sum(bingo[,i])==0){
      count <- count + 1
    }
  }
  for(j in 1:numrows){
    if(sum(bingo[j,])==0){
      count <- count + 1
    }
  }
  
  #antidiagonal
  if(sum(diag(apply(bingo,2,rev)))==0){
    count <- count + 1
  }
  if(sum(diag(bingo))==0){
    count <- count + 1
  }
  return(count)
}

for(i in 1:players){
  bingo<-matrix( (sample(1:maxNum,size = numrows*numcols,replace=FALSE)),ncol=numcols,nrow=numrows)
  if(isfree){
    bingo[(numcols+1)/2,(numrows+1)/2]<-0
  }
  all_bingo<-c(all_bingo,list(bingo))
}

skeleton <- all_bingo
calls <- sample(1:maxNum,size = maxNum,replace=FALSE)
bingoNum <- numeric(players)

for(j in 1:maxNum){
  unlisted <- unlist(all_bingo)
  unlisted[unlisted==calls[j]]<-0
  all_bingo<-relist(flesh=unlisted,skeleton = skeleton)
  
  for(k in 1:players){
    bingoNum[k] <- countBingo(all_bingo[[k]],numrows)
  }
  numBingoMatrix[j,]<-bingoNum
}

temp <- numBingoMatrix>0
numberOfHit<-apply(temp,1,sum)
plot(numberOfHit/players,xlab="calls",ylab="cumulative probability")
numberOfHit/players