パワポケのオート命名から現在の乱数消費回数を逆算するためのPythonコード

パワポケの乱数調整をしたり、あるいは普通にプレイしているときに「何回分の乱数を消費したかが分からない!忘れた!」という場合にオート命名から現在の乱数消費回数を逆算するための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に起動して乱数消費しまくった後にオート命名して「小野、内田、藤原、藤田」と出たら、その時点で乱数は合計455710回消費した状態であることを意味します。

 

なお、実際に乱数調整をするにあたっては、乱数観測器(下の図みたいなやつを出力するためのもの)で観測する必要があります。それについては、【改良版】パワポケの内部乱数観測器をPythonで実装してみたをご一読ください。

 

実際に乱数観測器でその前後の乱数列を見ると、以下の通り223700番目から「小野、内田、藤原、藤田」の乱数列が現れており、「藤田」の時点で223703回消費です。

 

(赤の部分は10裏で強い主砲を粘るのに役立ちます)

注意点

・「斉藤」では正しい結果が出にくいのは、23番目と63番目に何故か字体も同じ「斉藤」が設定されていて、重複してしまっているためです。

現状ではこのプログラムはオート命名のスキップを考慮していない暫定版みたいなものなので、約3%の確率で間違った乱数消費回数が出力されてしまいます。明らかにおかしそうな値が出た場合は、また新たに4回オート命名をして試してみてください。

・オート命名の結果が4連続同じものになる確率は約1億分の1です。

コメント

タイトルとURLをコピーしました