2017年02月21日

totoBIGの件は何が問題なのか、なるべく分かりやすく説明してみる


こんな記事を見かけました。




この件、ブックマークコメントなど見ていると、いまいち問題点が理解されていないのか、あるいは分かってて揶揄しているのか、ちょっとずれた責め方をしている人が何人か見受けられました。

恐らく、分かっていてネタで言っている人も多いとは思うのですが、今回のtotoBIGの問題点は、「出目操作」とか「イカサマ」といったものでは恐らくありません。当然、「奇跡的な確率」といったものでもありませんし、totoは「奇跡的な確率で偶然一致しただけだよ」とは言っていません。

じゃあ何かというと、多分バグというか、仕様がアホだった問題、だと思います。もしかすると、そこと景表法辺りが絡むのかも知れません。

スポーツくじ自体に興味はありませんし、totoをかばうつもりもないのですが、ちょっと上記のような話を見ていて、今回の問題をなるべく分かりやすく解説してみたくなりました。

以下の文章は、「疑似乱数」とか「PRNG」とか「ランダムシード」といったものについて既にご存知の方には、時間の浪費となるリスクが高いテキストです。そういった方にはブラウザの×ボタンを押すことをお勧めいたします。多分右上の方にあると思います。


〇そもそもどんな問題なの?

今回の件、そもそもの発端は、「ランダムな筈のtotoBIGくじが、2回購入した内の5口まで完全一致した」ということのようです。


totoBIGはサッカーの試合の勝敗を当てるくじですね。

もしこれが偶然の一致だとすると、確率は0.0000000000000000000000000000001%以下だそうで。下記はねとらぼさん。


これはこれでだいぶ煽った書き方でして、運営は別に「全くの偶然」とは言ってないんですが、まあそれは後述します。

で、こんなことが偶然に起こる訳がない!ランダムな筈じゃないのか!?これは不正な操作の証跡ではないか!?と問題になったのが発端、というわけです。


〇そもそもランダムって何?

ここで、コンピューターにおける「ランダム」というものについて考えてみたいと思います。

ランダムというのは、法則性がないこと、を指します。例えばサイコロの出目のように、何回振っても次の結果を予想することが出来ない時、その結果はランダムである、と言ったりします。

ランダムに作られた数列のことを、乱数といいます。どこをとっても無作為で、幾つかの数字から他の数字を予想したり計算したりすることは出来ないよ、という数列ですね。

しかし、コンピューターは元来計算機でして、中にサイコロを持っている訳ではありません。妖精さんがサーバの中でサイコロを振ってくれるわけでもありません。

その為、コンピューターは色々な方法で、「一見ランダムと変わらないけれど、深く調べると実は法則性がある」数列を生成して、それを乱数として使います。

これは、要するに「ランダムっぽい数列」であって、実際にランダムなわけではないんですが、まあちゃんと使い方を工夫すればほぼランダムと変わらないような扱いをすることが出来ます。

これを「疑似乱数」と言います。


〇疑似乱数についてもうちょっと詳しく

ランダムっぽい数列を作るには、色んな方法があります。これらを、「乱数生成アルゴリズム」と呼んだりします。

どんな方法があるかはこちらをご参照ください。


線形合同法とか、メルセンヌ・ツイスターとかが有名だと思います。勿論、これらのアルゴリズムをシステムにそのまんま実装する訳ではなく、普通はこれらのアルゴリズムを利用した、乱数生成のライブラリなりコマンドなりを使うことになります。それら、疑似乱数を生成してくれるプログラムを、擬似乱数生成器(PRNG)と呼んだりします。

本筋と全然関係ないですが、メルセンヌ・ツイスターってすげえかっこいいですよね。名前が。白銀聖闘士のミスティ辺りが技として使いそうな名前だと思います。

ここで、「ランダムシード」という言葉が出てきます。この言葉重要。


疑似乱数は、「一見ランダムっぽいけど、実は全部計算で作っている」乱数です。その為、元になる値が一致すれば、同じアルゴリズムは毎回同じ数列を吐き出します。これでは乱数として使い物にならないので、何かしら、乱数のもとになる値を変えてやらないといけません。(参考までに、これが今回の問題の一番重要なところです)

この、「乱数のもとになる値」のことを、乱数の種、ランダムシードといいます。このランダムシードを疑似乱数生成器に食べさせてやると、疑似乱数生成器は乱数っぽい数列を吐き出してくれます。それを、いろんなランダムな結果を作る為に使うわけです。

疑似乱数の質をなるべく高める為には、つまり十分ランダムな数列を得る為には、このランダムシードの扱いが一番重要です。この値をきちんと変えてやらないと、乱数は他の乱数と一致してしまいます。だから、このランダムシードは、なるべく「その場限り」の情報を元にして生成しようとするのが一般的です。

例えば、その瞬間にしか存在しない、日時分秒のデータとか。ユーザーのIDとプログラムの起動回数と日付を組み合わせたり、だとか。


要は、このランダムシードがきちんと散らばっていれば、疑似乱数はほぼ乱数と変わらない動きをするし、ランダムシードと乱数アルゴリズムがポンコツだと疑似乱数は全然乱数っぽくならないよ、という話なのです。


〇じゃあ今回のtotoBIGでは何が起きてたの?

疑似乱数とランダムシードの何かの仕様の問題で、2回のくじの内容がかぶっちゃったんじゃないの、というのが私が考える仮説です。

これは推測するしかないんですが、totoBIGでも同じく、上のような「疑似乱数」及び、何らかの「乱数生成アルゴリズム」を使っていた筈です。そして、何らかの値をキーにして、ランダムシードを生成していた筈です。他に「ランダム」を実現する方法が、(普通に使える範囲では)存在しないからです。

のランダムシードが何を元にしていたのか、というのが、今回の件で一番重要な要素です。

これは、購入する度に毎回変わるものでなくてはいけません。でないと購入する度に数列が一致してしまいます。また、購入した人ごとに変わるものでなくてはいけません。でないと、違う人が買った数列と一致してしまいます。

仮に私が乱数生成ロジックを担当する技術者であれば、「接続元のIPアドレスやMACアドレス、及び(あるなら)ユーザーIDや住所電話番号のような個々人で独自の値と、サーバの日時分ミリ秒を組み合わせて、それをランダムシードに変換すること」を考えると思います。このシードであれば、同じ人が、ミリ秒まで完全に同じタイミングで、同じパソコンと同じネット環境で、同じくじを購入しない限りは、きちんとランダムな数列が生成され、使われる筈です。こういう場合に妥当かどうかまでは知らない。

ただ、例えばこのランダムシードが、日時分までしか使っていなければ?(実は私は、この線を割と強く疑っているのですが)

1分の間に同じ人が二回購入すれば、ランダムシードの値は一致してしまいます。当然、生成される数列も一致してしまいます。その為、今回と同じような問題が発生し得る、という訳です。バカらしいですか?私もバカらしいと思うんですけど、案外バカらしいプログラムって普通に存在するものですしね。

勿論、「ランダムシードが被ってしまう」パターンは他にもいろんなものが考えられます。もしかすると、楽天経由での注文であることも関係があるのかも知れません。なんにせよ、疑似乱数が不出来なせいでランダム性に傷が生じる、というのは全然珍しいことではないのです。

つまり、今回の問題の原因は、ほぼ「疑似乱数生成器の使い方がヘボかった」ことに集約されます。天文学的な確率がどうとかはなんの関係もありません。バグ、ないし仕様の問題です。



〇今回のtoto側の対応はどうなの?

totoは、今回の件について、こんな風に発表しています。

また、コンピューターが投票内容(「1」「2」「0」)を発番する際の仕組みにおいて、重複した投票内容の出現はあり得るものであり、この事象につきましても、システムの不具合や不正な操作等によるものではないことを確認いたしました。(発番の仕組みの詳細につきましては、セキュリティ上の観点から公表しておりません。)

要は、上記のような疑似乱数生成の問題について、「バグじゃありません、仕様通りです」と言ってるんですね。

この文章自体は、「(天文学的な確率で)偶然一致しただけだよ!!」と言っている訳ではありません。つまり、totoは「嘘をついている」わけではありません。上記のような疑似乱数生成ロジックを使っているのであって、一致することは仕組み上あり得るんだよ、けど仕組み自体は教えないよ、と言っているわけです。これに納得するかどうかはともかくとして、この説明に「嘘つき!」というのは筋違いでしょう。

じゃあこれは、今までのtotoの説明と合致するのでしょうか。

ちょっとFAQを漁ってみました。ランダム生成について、こんな記載がありました。


Q165. BIGで試合結果をコンピューターがランダムに選択するシステムはどのような仕組みですか。
BIGはあくまで『くじ』として、1口ずつ「1」「0」「2」の3つの選択肢を試合ごとに1/3ずつランダムに選択する仕組みとなっています。
上記のような仕組みであるため、ある特定の数字が連続して出現する可能性やその反対で出現しない可能性もあるため、結果的にくじの組み合わせに偏りが生じる場合があります。

あんまり細かいことは書いてないですね。ただ、「ランダムに選択する」とは言っているので、「今回のような不適切な疑似乱数が発生するシステムを、ランダムと言っていいのか」という争点は発生する、のかも知れません。

ただ、ヘボい疑似乱数が他に存在しないか、というとそんなこともない訳であって、今まで疑似乱数の品質由来の訴訟やら判例やら存在しないかな?と思って、ちょっと調べてみたのですが見つけられませんでした。これは単に私の探し方が悪いだけかも知れませんので、もうちょっと追加で調べてみます。

疑似乱数自体に「ランダムとは言えない」というNG判定が出ることはほぼあり得ない(そうすると、世界中のコンピューターシステムで「ランダム」という言葉がつかえなくなってしまいます)ので、法的に今回の件がNGと出るかどうか、というのは難しい問題であるような気もします。


勿論、「totoのような大規模なくじで、疑似乱数生成ロジックがヘボかった」というのは、それ自体非常に大きな問題だと思います。その為、この辺のロジックがもう少し明確にされる、ロジック周りの改良がなされる、といった動きはあっていいように思います。そういう動きがなかったとしたら、totoくじの信頼性が低下してあんまり売れなくなる、ということもあり得るでしょう。

その辺は今後観測してみたいと思います。



ということで長々と書いて参りました。結論というかまとめとしては、


・コンピューターの「ランダム」は、一般的なイメージの「ランダム」とはちょっと違うよ
・今回の問題は、作為とか不正というよりは多分疑似乱数生成ロジックがヘボかった問題だよ
・もし法的な問題が発生するとしたら、「上のようなヘボいロジックが「ランダム」という言葉に値するか」という問題になると思うよ
・カルドセプトサーガのダイス問題?イヤな事件だったね…


という感じになると思いますが、まあ最後の件はどうでもいいです。

今日書きたいことはこれくらいです。


---------------------------------------------------------------
(追記 2/21)
すいません、一点情報が抜けてました。今回購入されたくじ、同じタイミングで買ったものかと思ったら、別の日に購入されたものらしいですね。

だとすると私が書いた、「例えばこのランダムシードが、日時分までしか使っていなければ」というのは外れですね。疑似乱数生成とランダムシードの問題であること自体は変わらないと思うんですが、どんな実装だったんだろう。



posted by しんざき at 07:22 | Comment(32) | TrackBack(1) | 雑文 | このブログの読者になる | 更新情報をチェックする