1. はじめに
どうも、趣味でデータ分析している猫背なエンジニアです。
え~宝くじで一攫千金したくないですか?
宝くじの当選番号を予測するシステムを長年愛してやまない『新世紀エヴァンゲリオン』に登場するMAGIシステムをコンセプトに、つくりたい!そうしたい!と思って開発記録を書いていきます。この記事ではモデル構築編の第弐弾と題し『BALTHASAR』を紹介します。
2. これまでの「🎯Numbers3&4の当選番号を予測する『MAGI』システムを作る」
西暦2025年。
あるエンジニアは、繰り返される敗北の記録——「宝くじの外れ券」の山に終止符を打つべく、ひとつの意思決定機構を構築する決意を固めた。
その名は―― N-MAGIシステム。
モデル名はMELCHIOR、BALTHASAR、CASPER。
それぞれが異なる思考ロジックを持ち、合議によって“もっともらしい当選数字”を導き出す。
ベースとなったのは、かつて存在した神話と、そして…アニメ『新世紀エヴァンゲリオン』の意志決定AI。
過去のデータ、時系列学習、出現頻度、逆張りアルゴリズム。それらを融合させ、抽選数字の予測という“人類補完計画”にも似た夢を追い求める開発者の姿があった。
すべては「当てたい」という欲望と、「遊びたい」という本能のままに。
っていう茶番はおいといて...本編に入ります👍
3. BALTHASARのモデル選定(復習)
概要編の4.MAGIを構成する3つの『脳』の選定でモデルの説明をしました。振り返りですが、BALTHASARの人格は母親とされ、独自解釈では統計的中庸型としていました。
< 設計モデルは? >
BALTHASARに採用した統計的中庸型はバランス型という認識であり、既存のモデルはないので、専用に設計しました。
本モデルではランダム関数を用いるのですが、少し工夫を凝らして設計します。
一般的なランダム関数を使った数字出力は、文字通り範囲が決まった中からランダムに出力しますが、本モデルでは、「各桁ごとの過去の出現頻度」に基づいて、「よく出た数字上位3つからランダムに選んで4桁を構成する」というように過去データとランダムを使う合わせ技なモデルを設計しました。命名するならば「RandTopNUMBERS4 Model」ですかね(笑)
< 独自アルゴ RandTopNUMBERS4 Model の仕組み >
過去の数字の頻度という統計データを用いて、出現頻度が高い数字をランダムに選出するということはお分かり頂いたと思う。作成したソースコードを数式に示すと以下のようになる。
■ ステップ1:桁ごとの出現頻度を計算
各桁 $i = 0, 1, 2, 3$ について、数字 $k \in {0, \dots, 9}$ の出現回数:
$$
f_i(k) = \sum_{n=1}^{N} \delta(d^{(n)}_i = k)
$$
($\delta(\cdot)$ はクロネッカーのデルタ関数)
■ ステップ2:上位3個の頻出数字の抽出
各桁ごとに、出現頻度が多い順に3つの数字を抽出:
$$
T_i = \text{Top3}\left( {f_i(k)}_{k=0}^{9} \right)
$$
■ ステップ3:予測番号の生成
ランダム関数 $R_i$ を使い、各桁から1つ数字を選ぶ:
$$
\hat{d}_i = R_i(T_i),\quad \text{つまり } \hat{d}_i \in T_i
$$
それにより、1組の予測番号は:
$$
\hat{d} = [\hat{d}_0, \hat{d}_1, \hat{d}_2, \hat{d}_3]
$$
この操作を2回繰り返し2個の予測番号を生成する:
$$
\text{予測セット} = { \hat{d}^{(1)}, \hat{d}^{(2)} }
$$
■ 全体フロー
図で表現すると以下のような全体のフローになる。

4. いざ開発:BALTHASARによるNumbers4モデル(RandTopNUMBERS4 Model)の構築
Numbers4の過去当選データをもとに、独自予測モデル “BALTHASAR” の設計および実装プロセスについて詳細に述べる。
■ データ前処理, 出現頻度確認
本モデル(BALTHASAR)ではMELCHIOR同様に、Numbers4の各当選番号(4桁)を単なる整数値としてではなく、「千の位」「百の位」「十の位」「一の位」 という4つの桁情報に分解して処理を行う。この処理により、各桁ごとの数字の出現傾向や周期性を個別に扱うことができるようになる。
MELCHIORとは別の方法で[(数字, 頻度), ...]というように格納をしています。
for num in all_numbers:
digits = [int(d) for d in str(num).zfill(4)]
for i, d in enumerate(digits):
position_freq[i][d] += 1
■ 予測結果の出力
最終的な予測結果を格納するリストのソースコードは以下になっている。
各桁の出現頻度を多い順に取得し、出題頻度が高い上位3つの数字を抽出する。各桁の上位3つの中からランダムに1つ選んで、文字列として結合し、リストとして結果を返す。
predictions = []
for _ in range(2): # 2つの予測を作成
result = "" # 1つの予測番号(4桁)を格納する変数
for freq in position_freq:
most_common = freq.most_common()
top_digits = [d for d, _ in most_common[:3]]
result += str(random.choice(top_digits))
predictions.append(result)
return predictions
■ 出力形式と実行回数
本モデルもMELCHIOR同様に、1回の関数実行に対して2件の4桁予測番号を生成する設計となっている。このループでは、1ループ=1つの4桁予測番号の生成を意味する。ループは固定で2回回すように設計しており、結果として ['0839', '2174'] のような2つの予測値リストが出力され、X上では上位1つを表示している。
for _ in range(2): # 2つの予測番号を生成
...
predictions.append(result)
5. 予測結果と考察 ~BALTHASAR的予測?~
ここまでで、BALTHASARモデルの構築・設計思想・データ処理・構造について見てきました。実際に本モデルが出力する「未来の4桁予測番号」とは、どのようなものか?
以下に直近のものを提示します。(7/16に予測した次回(7/17)の当選番号)
BALTHASARの出力をどう扱うか
「絶対的な正解」ではなく、あくまで候補提示型AIとして捉えると、本モデルの意図が明確になります。
これはMELCHIORの際にも行ったことですが、決定権は人間にあります。
とはいえ、NUMBERS4に関しては雰囲気が似ていますね。ニアピンが出そうな予感...(笑)
今後の改善・拡張の方向性
本実装は出現する頻度という統計データとランダム関数を組み合わせた構成を採用していますが、さらなる精度向上や面白さを追求します。
- 各桁ごとに上位3つしか使っていないので、重み付けして乱数で選ぶ。
- ランダム関数のモデルを変更する。
6. 次回予告
7. 今後の記事予定(MAGI伝記)
1. 【作戦概要】:全体構想と設計方針
- 全体構想と設計方針
2. 【データ収集編】:過去の当選番号の収集
- 過去の当選番号をどう集める?
3. 【モデル構築編】:3種のモデル(CASPER / BALTHASAR / MELCHIOR)実装と精度比較
- CASPER / BALTHASAR / MELCHIORの実装と精度比較
4. 【投稿編】:X APIを用いた投稿
- X APIを用いて予測を自動投稿
5. 【UI&演出編】:MAGI風UIをTkinterで再現して、予測を視覚化!
- TkinterでMAGI風UIを構築
謝辞
今年の10月に30周年を記念すること、誠におめでたく思っております。前回の「庵野秀明展」に引き続き「30周年記念展ALL OF EVANGELION」にもぜひ行きたいと思っております。引き続き応援しています!



