筆者はパワポケシリーズにおける内部乱数観測器を【改良版】パワポケの内部乱数観測器をPythonで実装してみたで公開していますが、この記事のプログラムは乱数消費数が大きくなってプログラムの出力量が大きくなった時にどうしても動作が重くなる、といった難点があります。
そこで、本記事では乱数消費数が大きくても出力に時間がかからない(数秒程度)ようなプログラムを公開します。
なお、プログラムの用途などについては上に示した記事をご一読ください。
プログラム
目当ての乱数値の、前後500個分だけを表示するプログラム
です。
前後500個分以外は実際に使う場面が少ないことと、パワポケのオート命名から現在の乱数消費回数を逆算するためのPythonコードにより消費回数が特定できるようになったことから、表示数を大幅に減らしても問題なくなったことがこのプログラムの作成理由です。
プログラムの大幅なリライト、アルゴリズム変更はしていません。
青色のコメントアウトの該当部分は適切なパラメータに書き換えて実行してください。
# パワポケ乱数観測器 class Color: RED = '\033[31m' YELLOW = '\033[33m' BLUE = '\033[34m' CYAN = '\033[36m' END = '\033[0m' namelist = [ '佐藤','鈴木','高橋','田中','渡辺','伊藤','山本','中村','小林','加藤', '松尾','菊地','野村','新井','渡部','佐野','杉本','大西','桜井','古川', '吉田','山田','佐々木','斉藤','山口','松本','井上','木村','林','清水', '山崎','池田','阿部','橋本','森','石川','中嶋','前田','小川','藤田', '岡田','後藤','長谷川','石井','村上','近藤','坂本','遠藤','青木','藤井', '西村','福田','三浦','藤原','岡本','松田','中川','中野','原田','小野', '田村','竹内','金子','斉藤','和田','中山','石田','上田','森田','柴田', '原','酒井','工藤','宮崎','横山','宮本','内田','高木','谷口','高田', '丸山','今井','河野','小島','藤本','村田','武田','上野','杉山','増田', '小山','大塚','平野','菅原','久保','千葉','松井','岩崎','木下','野口' ] #1:DS Liteでの起動時間。時間 h 分 m 秒 s h = 19 m = 30 s = 11 #2:表示したい乱数の消費回数 N = 2266381 Y = 0 X = h * (2 ** 16) + m * (2 ** 8) + s + 1 A = 0x5d588b656c078965 C = 0x0000000000269ec3 M = 2 ** 64 print(0, "番目 " ,0) for i in range(0, N+500): Y = X X = (X * A + C) % M if i>N-500: if 0 < X < 0.005 * M: #3:●●●MP確率。11裏では0.005 * M、12裏では0.02 * M。それ以外は0 * M。●●● print(i+1, Color.RED + "★★ ",namelist[int(100*X/M)] + Color.END, X/M) print("MPだああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ") elif 0.005 * M < X < 0.2 * M: #3:●●●11裏では0.005 * M、12裏では0.02 * M。それ以外は0 * M。●●● print(i+1, Color.RED + "★★ ",namelist[int(100*X/M)] + Color.END, X/M) elif 0.2 * M < X < 0.4 * M: print(i+1, Color.YELLOW + "★★ ",namelist[int(100*X/M)] + Color.END, X/M) elif 0.8 * M < X < M: print(i+1, Color.BLUE + "★★ ",namelist[int(100*X/M)] + Color.END, X/M) elif 0.6 * M < X < 0.8 * M: print(i+1, Color.CYAN + "★★ ",namelist[int(100*X/M)] + Color.END, X/M) elif 0.4 * M < X < 0.6 * M: print(i+1, "★★ ",namelist[int(100*X/M)] , X/M) if (100 * Y / M) // 1 == (100* X / M) // 1: print("●スキップ●")
青色のコメントアウト部分について
プログラム全体の解説は、【改良版】パワポケの内部乱数観測器をPythonで実装してみたをご覧ください。
本記事のプログラムは、単に表示数(出力数)を必要な部分だけにして時間短縮しただけにすぎません。
#1:DS Liteでの起動時間。時間 h 分 m 秒 s
DS初代かLiteで「パワプロクンポケットn」でAを押した瞬間の時間を入力
します。
#2:表示したい乱数の消費回数
目当ての乱数消費回数や、現在の乱数消費回数(パワポケのオート命名から現在の乱数消費回数を逆算するためのPythonコードで調べられます)など、表示したい乱数値の消費回数を入力します。
#3:●●●MP確率。11裏では0.005 * M、12裏では0.02 * M。それ以外は0 * M。●●●
11裏や12裏でMP装備を作りたい場合は、上記の通りに書き換えます。
それ以外の場合は0 * Mで大丈夫です。
コメント