第5/5話 必然の理由
芳菜とギャンブルで対決した日から、十日が経過した。
「どうですか、作業の進捗状況は?」
机の上に置かれている大皿に手を伸ばしながら、瑪瑠が、そう宣敬に訊いた。大皿には、アマッタル・ボールズだのショッパ・キューブズだのゲキシブ・テトラズだの、さまざまな菓子が盛りつけられていた。
二人は、パソコン部の部屋にいた。今は休憩中であり、菓子を食べながら、駄弁っているところだ。
「きわめて順調だ」宣敬は、大皿のチョコフレークエリアの一部を、わし、と右手で掴むと、口の中に放り込み、ばりぼり、と咀嚼し始めた。「物体の動きは、とても滑らかだし、複雑な処理を行わせることもできる。ハイクオリティな物理演算アプリケーションを買った甲斐があったな。これなら、LFSRゲームフェスタでの入賞も、夢じゃない。
統合開発環境も、有償版にアップグレードしたから、かなり使いやすくなった。無償版で四苦八苦していた、あの頃の自分が、本当、愚かに思えてならないよ」
「そうですか……それはよかったです」瑪瑠は、ふふ、と微笑んだ。「パソコンの演算能力も、強化できましたしね。以前は、開始から終了まで、数時間、あるいは数日かかっていたプログラムが、数秒、あるいは数瞬しかかからないようになりました。芳菜さんとのギャンブルに勝って、四百万円を手に入れたおかげです」
「芳菜と言やあ……」宣敬は、再び大皿に伸ばしかけていた手を、ぴた、と止め、彼女に視線を向けた。「けっきょく、見つからなかったんだよな? 平中芳菜、なんていう生徒は。うちの高校には」
「ええ」瑪瑠は、こくり、と頷いた。「わたしたちの同期生、なんて自己紹介は、嘘だったのでしょうね。どこからか制服を調達して、それで生徒を装い、校内に侵入したのでしょう。成人してはいらっしゃらないようでしたから、制服さえ着れば、本当の生徒と、見分けがつきませんし」
「そうか……」宣敬は、視線を大皿に向けると、右手を伸ばすのを再開した。「でも、本当に運がよかったよな。まさか、予想値と結果値が、ぴったり一致するとはなあ。一万分の一、0.01%を引き当てられた、ってわけだ」
「いえ」瑪瑠は、ふるふる、と軽く首を横に振った。「あれは、わたしの運がよかったわけではありません。わたしは、知っていたのです。次にボタンを押した時、生成される値は『0201』である、ということを。わたしが勝つことは、必然だったのです」
宣敬は、口に入れたビスケットを噛み砕くために動かしていた顎を、ぴた、と止めると、「知っていた?」と言った。彼女に視線を向ける。「次に生成される値を、だって?」
「はい」瑪瑠は、こくり、と頷いた。
「いやいや……」宣敬は、ゆるゆる、と首を左右に振った。「無理だろう、そんなことは。事前に知られるわけがない……ランダムで表示されるんだぞ、あの、四桁の数は。
実際、ほら、アプリを起動した後、お前、何度か、ボタンを押して、番号を生成したじゃないか。たしか……」記憶を探った。「『4843』『9202』『3587』『5838』だったはずだ。当たり前だが、これらの数には、まったく規則性がない。この次に生成される値が『0201』だなんて、わかるわけがないだろう」
「いえ、それが、わかるのですよ」瑪瑠は、腰の左右に両手を当てると、自慢げに胸を張った。「アプリの、あの機能には、擬似乱数が使われていましたから」
擬似乱数、と宣敬は復唱した。「おれも、ゲームを開発するうえで、何度か利用してはいるが……」ぽりぽり、と、右手の人差し指で右頬を掻いた。「あまり、詳しい仕組みは知らないんだよな……」
「そうですか。では、いい機会ですし、説明しましょう」瑪瑠は、三角形をした煎餅の頂点を前歯で挟むと、ぱき、と折った。「擬似乱数とは、一定の手法に基づいて生成される数列です。それは、一見すると、ランダムな値が並んでいるように見えます。しかし、実際には、その数列を導いたのと同じ手法を使えば、まったく同じ数列を生成することができるのです。
わたしは、芳菜さんとのギャンブルに挑む前──金曜日の晩に、家で、統合開発環境を使い、あの、宝くじ公式アプリを解析しました。その結果、4ディジッツ番号ランダム生成機能に用いられている擬似乱数列の生成手法を突き止められたのです」
「ちょ──ちょっと待ってくれ」宣敬は、右手を軽く挙げた。「金曜日の晩、だと? それは、おかしいだろう。だって、おれたちがギャンブルの内容を決められる、ということを、芳菜から伝えられたのは、当日、土曜日じゃないか」
「もちろん、金曜日の時点では、そういうことは、知りませんでした」瑪瑠は首を縦に振った。「しかし、それでも、わたしは、さきほど述べたような、4ディジッツ番号ランダム生成機能を用いる勝負に向けて、準備を行っていました。
別に、絶対にそのようなゲームで戦わなければならない、というわけではないではありませんか。当然のことながら、まったく関係のないことで対決する可能性は、じゅうぶんにありました。芳菜さんのほうがギャンブルの内容を定める、とか。
しかし、機会があれば、勝負内容を、4ディジッツ番号ランダム生成機能を用いるようなものにすることが、できるかもしれない──わたしは、そう思っていたのです。例えば、芳菜さんの決めたゲームに難癖をつける、みたいな。『あなたの提案したギャンブルでは、イカサマが行われる可能性があります』『わたしが今から提案するギャンブルのほうが、そのようなリスクが低いので、それにしましょう』みたいな、ね」
「なるほどな」宣敬は腕を組むと、うんうん、と頷いた。「準備しておくに越したことはない、ってわけだ。もし、ギャンブルの内容が、まったく別のものになってしまったとしても、大きなデメリットがあるわけじゃないし」
「そういうことです」瑪瑠は、こく、と頷いた。「話を元に戻しますね。4ディジッツ番号ランダム生成機能に用いられている擬似乱数列の生成手法は、『事前に定数Xを決定し、その値に基づいて生成する』というようなものでした。例えば、X=1なら、『6849、7101、9536……』という数列、X=2なら、『8494、7825、2132……』という数列、といった具合です。
つまり、このXさえわかれば、どのような擬似乱数列が生成されるか、あらかじめ知ることができるのです」
「それで?」いつの間にやら、宣敬は菓子を食べるのを忘れ、瑪瑠の話に聴き入っていた。「どうやって、その値を突き止めたんだ?」
「さらに解析を進めたところ、Xには、アプリを起動した時刻が、ミリ秒単位で代入されている、ということがわかりました」
「ふうん……」宣敬は腕を組んだ。「じゃあ、後は簡単だな。ギャンブルを行う時、アプリの起動時刻を計っておけば、Xを突き止められる」
「いいえ」瑪瑠は、ふるふる、と首を横に振った。「それが、そう単純な話ではないのです。
考えてもみてください。Xに代入される時刻の単位は、ミリ秒です。目視や感覚で、そのような細かい時間を計るのは、不可能でしょう」
「そりゃ、そうか……」宣敬は腕を解くと、両手を両腿の上に置いた。「じゃあ、どうやって、起動時刻を突き止めたんだ?」
「大した手法ではありません」瑪瑠は、ふふ、と自嘲気味に笑った。「わたしは、金曜日の晩に、プログラムを作成していたのです。Xを解明するためのプログラムを。それを、筆記具を買ってくる、と言って、カフェを出た後に、実行したのです。駅前にあるスーパーのトイレの個室に入った後、ショルダーバッグから取り出したノートパソコンで、ね。
確かに、目視や感覚では、アプリの正確な起動時刻を、ミリ秒単位で計ることは不可能です。しかし、ぴったりの時刻でなくても、ある程度の範囲を持たせた時刻なら、知ることができます。実際、あのギャンブルにおいて、アプリが起動されたのは、わたしの腕時計によれば、午前十時十九分の、三十秒から四十秒の間でした。
そして、もう一つ、有益な情報がありました。ほら、アプリを起動した後、わたしは、『4ディジッツ番号ランダム生成機能が正常に動作するか確認したい』と言って、四回、番号を生成したでしょう。たしか……『4843』『9202』『3587』『5838』だったはずです。
アプリの起動時刻は、午前十時十九分三十秒〇〇〇から、四十秒九九九の間です。つまり、Xの候補は、約一万個あるわけです。そのうち、それに基づいて擬似乱数列を生成すると、最初の四つが、『4843』『9202』『3587』『5838』となるような数。それこそが、Xです。
わたしが作ったプログラムは、とても単純でした。事前に、まず、アプリが起動された時刻の候補となる値の範囲において、最初に位置する時刻Aと、最後に位置する時刻B。これを、手動で入力しておきます。今回は、A=午前十時十九分三十秒〇〇〇、B=午前十時十九分四十秒九九九でした。
次に、アプリを起動した後、実際に4ディジッツ番号ランダム生成機能を用いて、一回目に生成した番号C、二回目に生成した番号D、三回目に生成した番号E、四回目に生成した番号F。これを、手動で入力しておきます。今回は、C=4843、D=9202、E=3587、F=5838でした。
最後に、プログラムを実行します。そうしたら、コンピューターが、午前十時十九分三十秒〇〇〇から、四十秒九九九までの、約一万個の値について、ひととおり、Xに代入し、約一万個の擬似乱数列を生成します。そして、その中から、一番目に位置する値が『4843』、二番目に位置する値が『9202』、三番目に位置する値が『3587』、四番目に位置する値が『5838』である数列を抽出します。それの生成に用いられたXの値こそが、今回のギャンブルにおける、アプリが起動された時刻、というわけです」
「ほお……」宣敬は口を窄ませた。「じゃあ、今度こそ、後は、簡単だな。そのXを用いて生成された数列の、五番目に位置する値──『4843』『9202』『3587』『5838』の次にある値を、確認すればいいだけだ」
「はい」瑪瑠は、にっこり笑った。「それこそが、『0201』だったわけです。
ですから、たとえ、わたしの運がどれほど悪かろうと、あのギャンブルで戦うならば、勝てる、という自信、いや確信があったのです。わたしの予想値と結果値が一致するのは、必然ですから」
「なるほどな……」宣敬は、ゆっくりと、何度も首を縦に振った。「あの勝負、予想値を選ぶのを、お前に任せて正解だったよ」
「ありがとうございます」
瑪瑠は、ふふ、と微笑みながら、ぺこ、と軽く頭を下げた。右手を大皿に伸ばすと、菓子を一つ摘まんでから、引っ込め、それを口に放り込む。照れているのか、顔がほのかに赤くなっていた。
顔は、みるみるうちに真っ赤になった。「えほ。えほ」咳き込み始めた。「えっほ。えっほ」
「な、何だ」宣敬は唖然として、口を半開きにした。「どうしたんだ、瑪瑠」
「かっ、かっ、かっ」彼女は今や、両目の端に、小さな涙粒すら浮かべていた。「かりゃっ。かりゃい。か、ら、い」
「辛い、だって?」
宣敬は、大皿の上、瑪瑠が摘まんだ菓子の配されているエリアに視線を遣った。
「たしか、さっきお前が口に入れたのは、『アマッタル・ボールズ』だったよな……」思わず、露骨に、呆れ返ったような表情をしてしまった。「もしかして……引いたのか? 十万個に一個、入っているっていう、激辛ボールを……本当、お前って、運が悪いよな」
瑪瑠はまだ咳き込んでいる。
〈了〉
乱数くじ対決の必勝法 吟野慶隆 @d7yGcY9i3t
★で称える
この小説が面白かったら★をつけてください。おすすめレビューも書けます。
カクヨムを、もっと楽しもう
カクヨムにユーザー登録すると、この小説を他の読者へ★やレビューでおすすめできます。気になる小説や作者の更新チェックに便利なフォロー機能もお試しください。
新規ユーザー登録(無料)簡単に登録できます
この小説のタグ
関連小説
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます