目的
ビンゴゲームは景品がすべて出るまで続行されることが多いです。
そのため、思ったより早く終わってしまったり、だらだら長引いてしまいがちです。
もし、参加人数や抽選回数が与えられたもとでのビンゴ者数が推測できれば、適切な景品数を事前に計画することができます。
そこで、ある抽選回数時点でのビンゴ者数を算出することで、ビンゴゲームのタイムキープを実現します。
方法
上記の問題は恐らく解析的に計算できないので、Rでモンテカルロ・シミュレーションを行います。
例の設定
用紙枚数(参加者数) 36名
シミュレーション回数 100000回
用紙のサイズ 5×5
数字の最大値 75(最も一般的なようです)
抽選回数 40回
なお、今回は列ごとに入りうる数字が決まっているビンゴカードを想定しています。たとえば、今回の例ではB列(一番左)には1~15の数字が入ります。
サンプルコード
折り畳み
set.seed(2024)
A <- 36 #用紙枚数
B <- 100000 #シミュレーション回数
L <- 5 #用紙のサイズ(L*L)
M <- 75 #数字の最大値(M>=L*L,M%%L=0)
N <- 40 #抽選回数(N<=M)
bingos <- numeric()#シミュレーション結果保存
for(b in 1:B){ #大会
bingo <- 0 #ビンゴ枚数
Y <- sample(1:M, N) #抽選
for(a in 1:A){ #各カード
X <- matrix(rep(0, L*L), ncol=L)#用紙
for(i in 1:L){
X[, i] <- sample(M%/%L, L) + M%/%L*(i-1)
}
X[ceiling(L/2),ceiling(L/2)] <- 0 #中心に穴あけ
Z <- matrix(rep(1, L*L), ncol=L) #判定用用紙 穴が0(視覚的に)
Z[ceiling(L/2),ceiling(L/2)] <- 0 #中心に穴あけ
for(i in 1:N){#抽選照合
for(j in 1:L){#行
for(k in 1:L){#列
if(X[j,k]==Y[i]){
Z[j,k] <- 0
}
}
}
}
Zd <- Z #右上がりの斜め判定用
Zd[1,]<-Z[5,]
Zd[2,]<-Z[4,]
Zd[4,]<-Z[2,]
Zd[5,]<-Z[1,]
result <- c(colSums(Z),rowSums(Z),sum(diag(Z)),sum(diag(t(Zd)))) #各列各行斜めのビンゴ判定
if(0 %in% result){bingo <- bingo+1}#ビンゴのある用紙のカウント
}
bingos[b] <- bingo
}
mean(bingos)
var(bingos)
sqrt(var(bingos))
hist(bingos,breaks=seq(0,A,by=1))
出力
折り畳み
> mean(bingos)
[1] 16.04541
> var(bingos)
[1] 11.149
> sqrt(var(bingos))
[1] 3.339012
結果
サンプルコードの設定だと、平均約16人ビンゴになるようです。
また、ヒストグラムを見ると、やや右に裾が長いことに目をつむれば、だいたい正規分布していそうです。
標準偏差が約3.3なので、景品を16個用意しておけば無難、極力時間内に終わらせたければ9個程度、極力間を持たせたければ23個程度用意しておけば安心でしょう(平均±2×標準偏差の範囲に約95%がおさまるので)。