読者です 読者をやめる 読者になる 読者になる

totoBIGで確率の低すぎる結果が出た件についてシステムの不具合を考えてみた

2ちゃんまとめサイトで、totoBIGを購入したら5口連続同じ結果になってしまった話が掲載されていました。
 
 
 
 
内容を一言で言うと、2回totoBIGを購入し、1回目は10口、2回目は5口買った結果、
最初の5口が2回とも全く同じ結果なってしまったという状態でした。
あまりにも確率が低すぎる出来事なので、2ちゃんねるでは不正があったのか?などと疑念を持ったコメントも見られました。
 

まず、totoって何?

totoサッカーくじのことです。
サッカーの14試合分の結果を、それぞれ
1:ホームチーム勝ち、2:アウェイチームの勝ち、0:引き分け、その他
で予想し、すべて当たったら1等になります。
基本的に、1週間に1回のペースで開催されています。
 
totoBIGは、この14試合のくじ結果をすべてシステムが勝手(ランダム)に選ぶものです。
 
1等の当選確率
totototoBIGの1等当選確率は、3択の試合が14試合分なので
 
3の14乗分の1の確率、478万2,969分の1になります。
 
ちなみに、ジャンボ宝くじの当選確率は、1000万分の1なので、計算上はtotototoBIGの方がジャンボ宝くじよりも億万長者になれる確率は高いです。
 
これは不正なのか?
冒頭にある、totoBIGの5口分の結果で完全一致が起こる確率は
 

約2,503,100,000,000,000,000,000,000,000,000,000 分の1です。

 
もうゼロが多くて意味不明な数字ですね。
 
漢字で表すと、約25溝0310穣分の1です。
 
これでも分からないですね笑
溝(こう)とは、10の32乗のことを表します。
ちょっとだけ分解すると、
1溝 = 1兆 × 1兆 × 1億
ということになります。
1兆が小さくみえてしまうレベルです。
 
ジャンボ宝くじでいうと、1等を4回当選する確率よりもさらに低い数字です。
 
偶然というレベルとは思えないほどの確率の小ささだとわかっていただけたと思います。
 
ではなぜこんなことが起きたのか。
 

大きく分けて原因は、「運営の不正」「とんでもない偶然」「システムの不具合」の3つの可能性がある。

 
「運営の不正」の可能性ですが、不正に関しては検証があまりにも難しい(中の人のリーク等が無いと発覚させるのはほぼ不可能)のでスルーします。
「とんでもない偶然」に関しては上記の通りあまりにも確率が低すぎるのでスルーします。
 
最後の「システムの不具合」の可能性ついて考えてみようと思います。
 

具体的に、システムにどんな不具合があると考えられるのか

ここからは少しプログラムの作り手側の話になります。
まず、totoBIGのシステムがどうやってランダムに試合結果を予想しているのかを考えてみます。
ランダムに試合結果を予想するとき、一般的にはプログラムで「疑似乱数」という数字を求めることになります。

 

疑似乱数とは、文字通りバラバラな数字のことですが、ある特定の計算方法で求められる数字です。
擬似乱数は計算で求められるため、バラバラな数字である「乱数」とは区別して用いられます。
 
擬似乱数を計算する際にはシード値(設定のようなもの)呼ばれる物を設定することになります。
このシード値の特徴は、同じ値に設定すると同じ結果の疑似乱数が得られるということです。
 
例えば、プログラムでサイコロのふるように1〜6の数字の範囲で、疑似乱数を発生させるプログラムを作ったとしましょう。
 
そのプログラムで、シード値を1に設定して4回分を実行した場合、
1回目 1
2回目 3
3回目 5
4回目 2
5回目 6
といった順にランダムに1〜6の数字が現れます。
 
そして、もう一度シード値を1にしてプログラムを実行すると
1回目 1
2回目 3
3回目 5
4回目 2
5回目 6
と全く同じ順に数字がでるような仕組みになっています。
 
擬似乱数の特徴は、シード値が同じ限り何回プログラムを実行しても
同じ順番で同じ数字が出る点です。
 
これが人間がサイコロを振るのとは大きく異なる部分です。
 
プログラムでランダムな結果を出すためには、擬似乱数のシード値自体も(可能な限り)バラバラなものに設定することが必要になります。
 
 
ソフトウェアで疑似乱数を生成する手法はこちらが参考になります。

www.4gamer.net

また、ソフトウェアではなくハードウェアを用いた乱数の生成手法は後述します。

 

擬似乱数のシード値が購入ごとに同じになっていたことが原因か

今回のtotoBIGの件では、2回の購入で「疑似乱数のシード値」が同じだったため、5口分が全く同じ結果になってしまったと考えるのが自然です。
 
totoBIGシステムが疑似乱数を発生させる際のシード値が何通りあるのか、そしてどんな方法でシード値を決定しているかは外部からはわかりませんが、冒頭の5口分が全く同じになる確率と比べるとかなり高いです。
仮にシード値をプログラムでよく使われる数字のint型(約42億通り数字が扱える型)とした場合、重複する確率は1840京分の1とかなり低い確率となるので、int型よりも小さい範囲でシード値を設定していたり、もしくはシード値の算出に際に偏りが出てしまっている可能性もあります。
 
つまり購入者の方は1回目10口、2回目5口を買っていますが、もし2回目も10口買っていたら、10口すべてが1回目と全く同じものになっていたということになります。
 
購入回ごとにシード値が一定のため、稀にシード値が一致した場合、5口だろうと100口だろうと何口買っても重複した結果しか出ないという仕組みになっているのでしょう。
 
もし本当にこの仕組みなっている場合、システムの不具合と言われても仕方ない状態だと思います。
 

公正なくじにするためには、乱数の生成手法は非常に重要である

PokerStarsというオンラインポーカーの人気サイトでも、乱数の生成についてはプイバシーポリシーのページで明記されています。
 
シャッフル

「乱数を生成する数学的な方法を検討する者は罪を負っている。」- ジョン・フォン・ノイマン、1951 年

公正で予測不可能なシャッフルアルゴリズムの使用が PokerStars ソフトウェアにとってきわめて重要であることを理解しています。これを行い、[1] で説明した大きな問題の発生を回避するために、真にランダムなデータを作成するため 2 つの独立したソースを使用しています。

    ユーザー入力。ソフトウェアから収集されたマウスの動きやイベント発生時の概要を含む。
    スイス企業 ID Quantique が開発した真のハードウェア乱数生成器 Quantis [2]。量子のランダム性をエントロピー源として使用。

これらのソースはそれぞれ公正で予測不可能なシャッフルを実現するために十分なエントロピーを生成します。
 
PokerStarsではハードウェア乱数生成器を用いているようです。
 

システムの改善策はどうすべきか

システムが上記の予想通りだった場合は、totoBIGシステムの改善策としては以下の2点が挙げられます。
1. シード値の範囲を広くする or 偏りを検証する
2. 購入ごとではなく、1口ごとに疑似乱数のシード値を変更する
 1口ごとにシード値を更新すれば、今回のように5口連続で同じ数値になる確率をかなり下げることができます。
 
自分もtotoBIGはたまに買うのですが、今後は同じ開催では複数回買わず、一度にまとめて買おうと思います。