パワポケの乱数調整をしたり、あるいは普通にプレイしているときに「何回分の乱数を消費したかが分からない!忘れた!」という場合にオート命名から現在の乱数消費回数を逆算するためのPythonコードを紹介します。
なお、本記事のプログラムはゲーム起動時間が分かっているという条件でのみ使えます。
(分かっていない場合は計算時間が膨大かつ後述の注意点から正確性に欠ける)
プログラム
青色のコメントアウト
の下にある部分は適切に書き換えて実行してください。
# 乱数消費回数測定器
namelist = [
'佐藤','鈴木','高橋','田中','渡辺','伊藤','山本','中村','小林','加藤',
'松尾','菊地','野村','新井','渡部','佐野','杉本','大西','桜井','古川',
'吉田','山田','佐々木','斉藤','山口','松本','井上','木村','林','清水',
'山崎','池田','阿部','橋本','森','石川','中嶋','前田','小川','藤田',
'岡田','後藤','長谷川','石井','村上','近藤','坂本','遠藤','青木','藤井',
'西村','福田','三浦','藤原','岡本','松田','中川','中野','原田','小野',
'田村','竹内','金子','斉藤','和田','中山','石田','上田','森田','柴田',
'原','酒井','工藤','宮崎','横山','宮本','内田','高木','谷口','高田',
'丸山','今井','河野','小島','藤本','村田','武田','上野','杉山','増田',
'小山','大塚','平野','菅原','久保','千葉','松井','岩崎','木下','野口'
]
n1=n2=n3=n4=100
#1:DS Liteでの起動時間。時間 h 分 m 秒 s
h = 11
m = 44
s = 8
#2:オート命名4回の名前を入力
name1='小野'
name2='内田'
name3='藤原'
name4='藤田'
for j in range(0,100):
if namelist[j]==name1:
n1=j
if namelist[j]==name2:
n2=j
if namelist[j]==name3:
n3=j
if namelist[j]==name4:
n4=j
#3:乱数生成回数
N = 2000000
Y = 0
X = h * (2 ** 16) + m * (2 ** 8) + s + 1
A = 0x5d588b656c078965
C = 0x0000000000269ec3
M = 2 ** 64
An2=A**2%M
Cn2=C*(A+1)%M
for i in range(0, N):
Y = X
X = (X * A + C) % M
if n1 == (100 * Y / M) // 1 and n2 == (100* X / M) // 1 and n3 == (100*((X * A + C) % M) / M)//1 and n4 == (100*((X * An2 + Cn2) % M) / M)//1 and i>0:
print(i+3)
コメント部分の解説と実行結果
コメント部分の解説
3つあるプログラム中の青色のコメントアウトは適切な値に変える必要があります。
1:起動時間
#1:DS Liteでの起動時間。時間 h 分 m 秒 s
h = 11
m = 44
s = 8
DS初代またはLiteで「パワプロクンポケットX」(Xは9-12で確認済み)を、Aを押して選んだ瞬間の時間を入力します。
2:オート命名で出た名前
#2:オート命名4回の名前を入力
name1='小野'
name2='内田'
name3='藤原'
name4='藤田'
表サクセスのオート命名を4回行い、出た順に上から「’●●’」の●●の部分に入力します。
注意点としては、「斉藤」が出た場合は正しい結果が出ないのでそれ以外の名前が4つ出るまでやってください。(理由は後で書きます)
3:乱数生成回数
#3:乱数生成回数
N = 2000000
推定される乱数消費回数よりも大きいであろう値を入力します。
200万くらいあれば通常プレイや計算時間を考えれば十分かと。
多くても数千万くらいにしておきましょう。
実行結果
本記事のプログラムを実行すると、
223703
と出力されます。
これは、11:44:08に起動して乱数消費しまくった後にオート命名して「小野、内田、藤原、藤田」と出たら、その時点で乱数は合計223703回消費した状態であることを意味します。(オート命名を使っている都合上、1-2回くらいのズレあり)
なお、実際に乱数調整をするにあたっては、乱数観測器(下の図みたいなやつを出力するためのもの)で観測する必要があります。それについては、【改良版】パワポケの内部乱数観測器をPythonで実装してみたをご一読ください。
実際に乱数観測器でその前後の乱数列を見ると、以下の通り223700番目から「小野、内田、藤原、藤田」の乱数列が現れており、「藤田」の時点で223703回消費です。
(赤の部分は10裏で強い主砲を粘るのに役立ちます)
注意点
・「斉藤」では正しい結果が出にくいのは、23番目と63番目に何故か字体も同じ「斉藤」が設定されていて、重複してしまっているためです。
・現状ではこのプログラムはオート命名のスキップを考慮していない暫定版みたいなものなので、約3%の確率で間違った乱数消費回数が出力されてしまいます。明らかにおかしそうな値が出た場合は、また新たに4回オート命名をして試してみてください。
・オート命名の結果が4連続同じものになる確率は約1億分の1です。

コメント
記事拝見させていただきました。
エラーコードはなにも出ないのですが、消費乱数も表示されません。コピペしたものはちゃんと出ました。なにか原因思いつきますか?
記事の投稿ありがとうございます。
私もパイソンをインストールし、上記コードを実行させたのですが、
下記エラーがでました。
SyntaxError: multiple statements found while compiling a single statement
14行目の 「 より右側が赤くなりました。
プログラミングが分からず、分からないなりに調べましたが、
解決方法が見つかりませんでした。
申し訳ないのですが、上記解決方法を教えて頂けますでしょうか。
エラーメッセージをそのまま検索すれば解決策が出てくるかと思います
このメッセージの場合、改行に関するものかと思います