2017/02/28 くじBIGのニュース
先日、ネットのニュースでこんな記事がありました。
以下ねとらぼから引用
----------------
「BIG」で宇宙誕生レベルの奇跡が起こる 運営側「全くの偶然」
確率は0.0000000000000000000000000000001%以下
ランダムで試合結果を予想するスポーツくじ「BIG」で、14試合×5口分の予想結果が一致したという画像が投稿され物議を醸した件で、日本スポーツ振興センターが見解を発表しました。担当者に取材したところ、システムの不具合や不正操作によるものではなく、全くの偶然によるものと結論づけられているそうです。
その確率は約2,503,160,000,000,000,000,000,000,000,000,000分の1。単位を追加すると約25溝0316穣0000杼0000垓0000京0000兆0000億0000万0000分の1となります。
----------------
「BIG」はサッカーの試合結果を予想するくじですが、くじを購入する際、自動で予想を作成してくれる機能があって、その機能を利用してくじを購入したら、ある時とある時の予想内容がぴったり一致した、と言うことらしいです。
14試合×5口分の一致する確率がかなり奇跡的なため、コメントでいろんな憶測が飛び交ってました。
でも、これ、乱数を使ったプログラムを作ったことがある人なら、いろいろ思い当たることがあるんじゃないかと思います。
まず、プログラムでは本当の意味での乱数を作るのが難しいと言うこと。
プログラム言語に乱数を発生させる機能が用意されていることが多いのですが、単純にこれを使うだけではうまくいきません。
たとえば、ExcelのVBAなら、Rnd関数と言う乱数を発生させる関数があります。
Excelを起動して、VBAにイミディエイトウィンドウに「?Rnd()」と数回入力します。
その後、一旦Excelを終了させ、また同じことをします。
そうすると、Rnd()は最初と同じ値を返します。
乱数を生成すると言っても、あらかじめ決められた計算を行っているだけなので、こういうことになります。
さすがにこれでは乱数として役に立たないので、発生パターンを変えるための関数が用意されています。
同じく、ExcelのVBAでは、Randomize() と言う関数になります。
引数の値によって、発生パターンを変えられます。
が、これまた同じ値を使うと、同じ発生パターンになってしまいます。
なので、乱数を使うときは、その都度Randomize()に与える値をいかに変えるかが肝心です。
そこを適当に作ってしまうと、このニュースのようなことになってしまうかも…。
ここからちょっと蛇足ですが、Randomize()の発生パターンが32bitで変化するとした場合、発生パターンは、4,294,967,296通り。
64bitなら、18,446,744,073,709,551,616通りになります。
14試合×5口分の予想結果が一致する確率より、だいぶ桁数が少ないですが、Rnd()とRandomize()の機能の場合は、このくらいの確率で同じ発生パターンになってしまうと思われます。
Rnd()とRandomize()は、プログラムの初期の頃から存在する、古いタイプの物なので仕組みが単純です。
このニュースによって、厳密な乱数らしさを求められる場合は、別の方法を考えなければいけないんだな、と思いました。
2017/02/08 Z会のシステム障害
ちょっと前の事ですが、Z会のシステム障害がニュースになってました。
サービスの一部が提供できない、新規の受講受付ができないと言った状況になっているようです。
私的には、結構大変な事態のように感じたのですが、再開は4月頃となっていて、ずいぶんのんびりな対応だと思いました。
職業柄、どこのシステム会社がやらかしたのか気になったので、あれこれ検索してみたのですが、それっぽい情報は見つかりませんでした。
ただ、結構な規模があるようで、いろんな会社のインフラやミドルウェアを導入していて、その導入事例の紹介はいくつかありました。
で、あーこれはもしかしたらと思って、Z会の求人情報を見てみたら、講師や事務の募集の他に、エンジニアの求人が載ってました。
どうやら、自社の電算室を持っているようです。たぶん。
それで、対応が寛大なのか…。納得。