LoginSignup
0
0

ビンゴゲームのモンテカルロ・シミュレーション

Last updated at Posted at 2024-05-15

目的

ビンゴゲームは景品がすべて出るまで続行されることが多いです。
そのため、思ったより早く終わってしまったり、だらだら長引いてしまいがちです。
もし、参加人数や抽選回数が与えられたもとでのビンゴ者数が推測できれば、適切な景品数を事前に計画することができます。
そこで、ある抽選回数時点でのビンゴ者数を算出することで、ビンゴゲームのタイムキープを実現します。

方法

上記の問題は恐らく解析的に計算できないので、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))
for文を大量に使っているので低速です。

出力

折り畳み
> mean(bingos)
[1] 16.04541
> var(bingos)
[1] 11.149
> sqrt(var(bingos))
[1] 3.339012

結果

サンプルコードの設定だと、平均約16人ビンゴになるようです。
また、ヒストグラムを見ると、やや右に裾が長いことに目をつむれば、だいたい正規分布していそうです。
標準偏差が約3.3なので、景品を16個用意しておけば無難、極力時間内に終わらせたければ9個程度、極力間を持たせたければ23個程度用意しておけば安心でしょう(平均±2×標準偏差の範囲に約95%がおさまるので)。

image.png

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0