こんにちは!山梨大学大学院(医工農学総合教育部修士課程工学専攻コンピュータ理工学コース)1年の木島です。
皆さんは公平な抽選ってどういうものがあると思いますか?
宝くじのルーレット[1]はテレビでも見たことがあるかもしれません。
それでは逆に、外から見た時には抽選しているようには見えても実は中では、あらかじめ結果が作られている、そんなものもあるかと思います。
例えば学校のクラス替え[2]とかは典型的な例でしょう。
もしも、完全に公平だと思っていた抽選が実はあらかじめ結果が決められてると知ったら、少しがっかりしてしまいますよね。
そこで、今回からの連載では、プログラムを使って不正に強い、公平な抽選を行うゲームを作っていきます。
今回から作っていく予定のゲームはルーレットゲームとなります。
プレイヤーがFPGA(高速に処理を行う専用の電子機器)側に接続されたボタンを押して、その押したタイミングに基づいて、あたりかハズレか、そして演出時間を取得し、その結果を画面の演出へ反映させます。(FPGAについては後ほど簡単に紹介します)
なお、今回の記事でいう公平な抽選とは、プレイヤーや演出プログラムが後から結果を操作できない抽選とします。
図に今回のシステムの構成について示します。
図を見てください。
今回のシステムは、演出部と、抽選部の二段構成になっているのがわかりますね。
演出部ではPCという言葉がありますが、それはそのままパソコンでのプログラムを意味します。
PC側では、ルーレットの画面を表示します。
そして、FPGAから送られてきたあたりかハズレかの情報を、演出時間に基づいて画面へ反映させます。
一方で抽選部では、FPGA側に接続されたボタンの入力を受け取り、その押されたタイミングに基づいて、あたりかハズレか、そして演出時間の抽選を担当します。
ところで、コンピューターの業界においては、一つの大きなシステムで全部解決するのではなく、複数の小さなシステム同士が相互作用によって動作させていることが多いです。
わざわざ大きなシステムで解決するのではなく、システム同士が相互作用によって動作するメリットは何があるのでしょうか?
そのうちの一つとして、セキュリティを高めるというメリットがあります。
例えば、皆さんが持っているかもしれないiPhoneを例にあげましょう。
つい先日、iPhone XRやiPhone 11シリーズなどに関係するusbliter8[3]という脆弱性が公開されました。
これは、USBコントローラーまわりの問題をきっかけに、Appleが許可していないプログラム、つまり署名なしコードを起動処理の中で動かせてしまうというものです。
一方でiPhoneは、Secure Enclave Processor(SEP)と呼ばれる暗号化キーを守るためだけの独立した金庫のようなシステム、つまりプロセッサを持っています。
このプロセッサは、iPhoneの中にありながら、通常のアプリやメインの処理とは分離された仕組みになっています。
そのため、スマホの他の部分に問題があったとしても、暗号化キーなどの重要な情報が簡単には漏れないようになっています。
つまり、今回のバグだけで、見知らぬ人がスマホから暗号化キーを簡単に取り出せるわけではありません。
このように、一つのシステムにまとめるのではなく、役割ごとに分けることで、安全性を高めることにつながるのです。
ということで、このようなシステムの構造を参考に今回からの連載でゲームを作りましょう。
ところで抽選部ではField-Programmable Gate Array(FPGA)という見慣れない言葉がありますね。
これは一体なんなのでしょうか。
端的に説明すると、超高速に論理回路を解いた結果を出力することができる装置です。
皆さんは数学の授業で、例えば、ANDやORといったものを勉強したと思います。
ドモルガンの定理を解いていてこんなことを思いませんか?
「これって、入力と出力のパターンを全部暗記していれば、いちいち計算しなくてもすぐに答えがわかるのに。」
そうなのです、FPGAは内部に、Look-Up Table(LUT)と呼ばれる、入力に対する答えをあらかじめ記憶した真理値表をたくさん持っています。
そのため、計算を初めから順番に解いていくのではなく、LUTというカンペを組み合わせることで、複雑な条件でも高速に答えを出せるのです。
今回はこのFPGAを利用して抽選の結果を求めることにします。
FPGAを使うことで仮にPC側のプログラムを不正に書き換えられても、ボタン入力と抽選処理をFPGA側に分けておけば、PCだけで抽選結果を簡単に操作することは難しくなります。
こうすることで、不正に強い構成を目指します。
抽選するための具体的な方法は、FPGAを使った抽選部を作るときに検討することにします。
また、図を見ていただくと、Universal Asynchronous Receiver-Transmitter(UART)通信という言葉があります。
これは、パソコンとFPGAという違う仕組みで動く機械同士が会話するための、標準的なルールつまりプロトコルの一つです。
今回は、FPGA側でボタン入力を受け取り、そのタイミングで決定したあたりまたはハズレと、それらの演出にかかる時間を、UART通信でPCへ送る一方通行のシステムを作るつもりです。
PC側はその情報を受け取り、画面の演出へ反映させます。
以上の内容が、ざっくりと私が作りたいシステムの概要になります。
実は、このシステムは、現時点では、システムの構成を考えただけで完成はしていません。
今回は連載を通じて、皆さんと一緒にゼロから作っていこうと考えているため、途中で仕様が変わるかもしれません。
一緒にルーレットゲームを作ってみましょう!
今後の連載では、FPGA側の抽選部、PC側の演出部、そしてPCとFPGAをつなぐUART通信を作っていく予定です。
今後とも学生広報スタッフのサイトの更新を楽しみにしてください!
参考文献
[1] テレ東BIZ ダイジェスト, “年末ジャンボ宝くじ 抽選会,” YouTube, [Online]. Available: https://www.youtube.com/watch?v=WP7xz_MKxU0. [Accessed: Jun. 22, 2026].
[2] ベネッセ教育総合研究所, “小学校のクラス替えはどう決める?保護者の要望は通る?元小学校教員に聞いた,” ベネッセ教育情報サイト, [Online]. Available: https://benesse.jp/kyouiku/202103/20210328-1.html. [Accessed: Jun. 22, 2026].
[3] Paradigm Shift, “Introducing usbliter8,” Paradigm Shift, [Online]. Available: https://ps.tc/pages/blog-usbliter8.html. [Accessed: Jun. 22, 2026].
