Sun Sep 02 2018

日記・マジックビンゴについて

pic.twitter.com/WstATHoLqE

— 枚方 (cympfh) (@cympfh) September 2, 2018

今年の6/30に、キズナアイのバースデーパーティーというイベントがあり、行ってきた. キズナアイと近い位置で声を出して楽しむことが出来たので楽しかった. それはどうでもいい.

その中で、よくあるビンゴ大会があり、最初にビンゴをした人にプレゼントをするということだった. 最初にビンゴをした人、という点を強調してるのが不自然だった. また、抽選で選ぶ数字の発表が、予め作ってた動画の再生だったのも怪しかった. とはいえ、その場では何かを疑うなんて思いもしなかった. このイベントはバーチャルユーチューバーのイベントであり、基本的に全てがディスプレイの表示上のもので完結するのは不自然なことではなかっただろう. 公平性を演出する必要のあるビンゴでは不自然だが.

リーチの声を上げる者が増える中でなかなかビンゴは出ないでいた. ついに周りに、リーチが出来てない人はいないという状態になったとき、ある数字が発表されると共に、会場の全員が同時にビンゴと声を上げた.

つまり、こういうことだった

  1. 読み上げる数字の列は予め決まっていた
  2. ある数字が出るまでは誰もビンゴを完成させられず、その数字によってみんなが初めてビンゴを完成させた

このようなビンゴはいかにして作るのか.

ネタバレなのだが、適当にググると、このようなビンゴが「マジックビンゴ」という商品名で五所川原システムというところから販売されてることを知った.

さらにここでは簡単に作り方も載せられてある. このwebページの情報を総合するとこうだ.

  1. 読み上げる数字の列は予め決まっていて、27個目が51になっている
  2. 普通にビンゴのシート (あの穴を開けるカード) をランダムに作る

ようするに乱択だ. これでも 1% 程度で成功することが経験的にかどうか分かっているらしい. なら問題なさそうだ. 自然なものの内、偶然ビンゴするものを選ぶだけなので不自然なシートになりようがない、と保証できるのも良い.

乱択ではないマジックビンゴの作り方

このwebページを見るより前に作り方を考えてた. 個々の数字の配置はランダムだけど、必ず欲しい性質(あるタイミングで初めてビンゴする)を持ったシートを作ることを目指す.

読み上げる数字の列を予め決定することにする. ビンゴになる数字より後は読み上げないので、結局この数字の列は有限の長さしか持たない.

ところでよくある普通のビンゴ を想定する. シートには5行5列にマスがあり、マスには異なる数字が書かれている. ただしその真ん中は FREE と呼ばれ、数字が割り当てられないで、初めから開いてるものと扱う. また、使われる数字は 1 から 75 までの整数に限られている上に、列ごとにさらに制約がある. 第 \(n\) 行には \(1+15n\) から \(15(n+1)\) までの整数にさらに限られている. 例えば第2行は 16 から 30 までの整数の内の5つが使われることになる. 行については何の制約もない. もっとも、この話は、ここでは本質ではない.

使われる数字の集合を次のように命名する:

読み上げ列は長さに関するパラメータ \(L\) を決めて

と書ける. つまり長さ \(L+1\) の列であって、その最後の \(c\) でビンゴにしたい.

ここまで形式的に真面目に解説するようなことなのか疑問に思えてきた. 要するに、読み上げ列が予め決まってるので、\(X\) はビンゴになるまでに読む数字の集合 \(A\) (上の列 \(A\) のこと) と、 ビンゴにする数 \(c\) と、絶対に読まれない数字の集合 \(B\) とに \(X\) を分けることが出来る、というのが重要.

作り方

  1. 読み上げ列を作る
  2. \(c\) をランダムに配置する
  3. \(c\) を通ってビンゴになる列を1本以上選ぶ
  4. そのビンゴ列の内 \(c\) 以外のマスを \(A\) の数字で埋める
  5. 他の埋めてないマスは、使ってない数字からランダムに選んで埋めればいい、のだが

以上

実装