初期SEED検索のコードの9割はAI (無料枠のChatGPT-5と無料のGemini Pro)を使って2日で完成させました。(流用したCUI版の5genSeedUntiもAIに作らせた)
つまり、AIにコードを書かせれば誰でも乱数ツールが作れるわけですね!こういうのに興味がある人はやってみましょう。
やれと言われた気がするので複数回に分けてやっていきます。
この記事は、AIを使って初めて乱数調整ツールを自作するガチ初心者向けです。
乱数調整ミリしら人は「乱数調整入門」を見てからきてください。
⚠注意事項⚠
・少しずつ書きかけを更新していきます。
・C#ミリしら人なので、詳しいことはAIに聞いてください。
・AIはChat-GPTとGemini Proを使用しています。
・プロンプトの管理は面倒くさいのでやりません。
・乱数調整ツールのweb移植は試行錯誤を含めていつかやります。
はじめに
「乱数調整ツールをつくる」と言うと、なんか難しそうに聞こえますが、実際にやっていることはただの四則演算です。簡単ですね!
5世代以前のポケモンに限らず、Nintendo DSで発売されたゲームの大半は初期乱数の制御が簡単(一部を除く)で、乱数調整の開拓難易度は低めです。
つまり、ほとんどのゲームは開拓されていないブルーオーシャンというわけです。それだけの価値があるかは置いておいて。
この記事では、これの流れに沿って進めていきます。なに書いてるかわからないけど参考程度に。(以降、参考資料と呼びます)
乱数調整プログラムC#実装 Advent Calendar 2023 - Adventar
どの言語で作るかは自由ですが、C#だと気持ちよく書けるらしいです。知らんけど。
乱数列をつくる
参考資料の1日目、2日目をやります。
乱数列を作るにはまず、線形合同法(LCG)のパラメータを知る必要があります。
DPtなら32bit LCG:R[n+1] = R[n] * 0x41C64E6D + 0x6073
BW/BW2なら64bit LCG:R[n+1] = R[n] * 0x5D588B656C078965 + 0x269EC3
古いゲームでは32bit LCG、ある期間からは64bit LCGが使われてるらしいです。(開発元による)
ポケモン以外のゲームで乱数調整を開拓するなら各自で調べることになります。エミュレータかなんかで調べましょう。
【エミュレータの導入】
【パラメータの調査】
(これ以外に参考になりそうなのが見つからない)
LCGのパラメータ調査が終わったらAIの出番です。
AIに渡すプロンプト(指示)には以下の要素を含ませます。
- 乱数調整用のツールを作ること
- 疑似乱数にはLCGを使用し、連続した乱数列を出力したい旨
- LCGの各種パラメータ
- その他、初期SEEDの入力や乱数列の長さなどの設定
「初期SEEDは16進数の32bit」、「乱数列の長さを入力したい」、「ファイル名を入力してテキストファイルとして出力したい」なども追加すると良いです。
プログラミングのやり方自体がわからないならAIに聞きましょう。
LCGのパラメータがR[n+1] = R[n] * 0x41C64E6D + 0x3039、32bitの16進数の入力、乱数列の長さの入力、テキストファイルで出力する旨を伝えると、このようなコードが返ってくると思います。
class LCG
{
static void Main()
{
Console.Write("Enter Initial SEED : 0x"); // 初期SEED入力
if (uint.TryParse(Console.ReadLine(), System.Globalization.NumberStyles.HexNumber, null, out uint Seed))
{
Console.Write("Enter SEED Count :");
if (int.TryParse(Console.ReadLine(), out int count) && count > 0)
{
Console.Write("Enter File Name :");
string outputPath = Console.ReadLine();
if (!outputPath.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
{
outputPath += ".txt";
}
using (StreamWriter writer = new(outputPath))
{
for (int i = 1; i < count; i++, Seed = NextSeed(Seed))
{
Console.WriteLine($"Count:{count}, Seed:{Seed:X8}");
writer.WriteLine($"Count:{count}, Seed:{Seed:X8}");
}
Console.WriteLine($"Generated {count} seeds. Output saved to {outputPath}");
}
}
else { Console.WriteLine("Invalid Input for SEED Count."); }
}
else { Console.WriteLine("Invalid Input for Initial SEED."); }
}
static uint NextSeed(uint Seed)
{
uint a = 1103515245;
uint b = 12345;
return (a * Seed + b);
}
}
プログラムの流れとしては、
- 初期SEEDを入力。16進数に変換し、無効な入力ならメッセージを返す。
- 乱数列の長さを入力。無効な入力ならメッセージを返す。
- ファイル名を入力。入力に".txt"がない場合追加する。
- 乱数列を生成する。
といった感じです。
要所要所でわからない点は調べるか、部分的にAIに聞くようにしましょう。その行動がいずれ役に立つはずです。
乱数処理をつくる






