ツール

SM孵化乱数列を計算する

SM持ってないけどSM孵化検証やってます。
準備に手間はかかりますが乱数調整可能です。

今回はその乱数列計算に関する内容になります。
某ツールを使えば出来るとか言わない!

WEB上で計算する奴作ってみた。
http://blog.livedoor.jp/x_x_saki_x_x/RNG/SMBreeding.html


●事前知識

SM孵化仕組み検証
http://blastoise-x.hatenablog.com/entry/SM-breed

SM孵化の乱数列生成アルゴリズムについて
http://odanpoyo.blogspot.jp/2016/12/sm.html


●使用されている乱数

「SM孵化の乱数列生成アルゴリズムについて」にもある通り、
今回のSM孵化には「TinyMT」なる乱数列が使用されている。
この乱数列は内部状態としてstatus[0-3]の128bitを持ち、それを調律したものが出力される。
BWの64bit検索でも通常PCでは全探索は事実上不可能であったので、当然全探索という力技はできない。

また、調律の処理が曲者で、非線形となる処理をしているため逆算するのが難しくなっている。
TinyMTには調律を線形とする設定もあるが、その場合の逆算についてはこちら。
http://d.hatena.ne.jp/oupo/20161210/1481361175

 ↓非線形になる原因箇所
#if defined(LINEARITY_CHECK)
    t1 = random->status[0]
	^ (random->status[2] >> TINYMT32_SH8);
#else
    t1 = random->status[0]
	+ (random->status[2] >> TINYMT32_SH8);
#endif

今回はその非線形を回避すべく、最下位bitのみに注目してみることにする。


●何故最下位bitなのか

TinyMTでは基本的にビット演算で処理を行っているが、
その中に加算が交じることで非線形となってしまっていた。
その原因は繰り上がり処理。
繰り上がりを考慮しなければ加算はただのxorであるので、
繰り上がりの影響を受けない最下位bitだけを見れば線形は保たれていることになる。


●計算してみる

status[]から出力される最下位bitを計算してみると、
出力はstatus[3]の最下位bitと同じであることが分かる。

この出力の最下位bit列 $y$ から初期status列 $x$ を求める行列 $A^{-1}$ があればそれを求めたい。
$y=Ax \Leftrightarrow x=A^{-1}y$

まず、内部状態の更新処理を行列で扱えるよう変換する。
この際、status[0]の最上位bitを除外し、127×127となるようにする。
(status[0]の最上位bitは更新処理時に欠落する情報であり、また出力最下位bitから復元できないので、あると行列が正則にならない。)
その行列の0乗から126乗を求め、status[3]の最下位bit計算に使用する行を取りだして並べると $A$ が求まる。
この $A$ を計算した結果正則であったので、逆行列 $A^{-1}$ が求まった。


というわけで、無事連続する127個の最下位bitから元のstatusを計算することができました。
個体値列からの検索もやりたいけど課題が多いのでどうなることやら。

WEB上で計算する奴も作ったので是非乱数調整しましょう!
現時点で乱数列から出力計算してくれるツール公開されてないと思うけど。

第4世代ID調整用初期シード検索ツール(WEB版)

作ってみた。
第4世代ID調整用初期シード検索ツール(WEB版)
今更なのは気にしてはいけません。
JavaScript使用。

全範囲実装済みは一部表IDのみ。
性格値からの計算は自分でやって。

DL版はこちら
http://blog.livedoor.jp/x_x_saki_x_x/archives/53827093.html

ポケトレ多連鎖乱数用ツール更新

更新。
http://www1.axfc.net/u/3332237?key=rensa
または
Yahoo!ボックス

Microsoft .NET Framework 4をインストールする必要あり。
バグ報告とかはコメントでお願いします。

更新したといいつつまだVer0.1です、はい。

●更新内容
・40連鎖で死亡するクソ仕様バグを修正
・移動に伴い草マップも移動するよう更新
 ちゃんとは確認してないから恐ろしい挙動出るかも。
 大丈夫だと思います。多分。

これで安心して多連鎖できるね!そんな訳あるか

ポケトレ多連鎖乱数用ツール

最新版(Ver0.1)はこちら。
http://blog.livedoor.jp/x_x_saki_x_x/archives/54963120.html



今更ながら本格的に作り始めました。
しかしながらVer0.0という。
http://www1.axfc.net/u/3275962?key=rensa

Microsoft .NET Framework 4をインストールする必要あり。
バグ報告とかはコメントでお願いします。
 
草の有無は履歴に反映されない仕様になってます。
40連鎖以降の閾値上限設定し忘れたので40連鎖でしにます。


仕様確認していない部分もあるのでどっか間違えてるかも。
使い方はまあ、そのうち書くかも。多分。 

DPtコイントス初期シード検索ツール

作ってみた。
http://www1.axfc.net/u/3209269?key=cointoss
追加データ(CoinTossData.bin):Googleドライブ

Microsoft .NET Framework 4をインストールする必要あり。
追加データは1.5GBあるのでそのつもりで。


●仕組み
第4世代ID調整用初期シード検索ツールみたいのをやってみたかっただけ。
CoinTossData.binに65535Fまでの初期シードをコイントスの結果が昇順になるように並べ替えたデータを入れて、あとは似たような感じ。
ついでに条件により参照しない検索方法も付けてみた。
でも絶対後者のが使われる。


●機能
画像は面倒なので省略。

起動後からコイントス以外でコイントス完了までにMTを消費していない場合のみに対応。
フレーム数も65535Fまで。それより先はコイントス出来る状況でやる人いないでしょ。
そのままでも使えるが、オプションとしてCoinTossData.binを.exeと同じフォルダに置けば、検索範囲がある程度広いコイントス8回以上のものに対しCoinTossData.binを参照して検索するようになる。
8回とかの基準はだいたい適当。

・検索列:コイントスの結果をスペース等を入れずに入力
表:o、O、o、O、○
裏:x、X、x、X、×
に対応。
64文字まで。

・他
見りゃ分かる。分からん奴とかおらんやろ。
条件が緩すぎるまま検索しようとするとアラートが出るようにしてある。
検索結果は初期シードだけですが今後もフレーム数等を表示する予定は全くありません。


~おまけ~


DPtコイントスの結果はMTの最下位1bitだけを取ってるということで、不要な部分の計算省けそうだなーとか考えてた時のメモ。
更新後のテーブルの値の各bitに適当な文字を割り当てて、それらで最下位bitがどう表せるのか計算した結果、見ての通りの6箇所のbitのxorを取れば良いという結論になった。
で、これを.bin作成時にもツール内部にも組み込んでみた。

という訳で、正解は「MT最下位bitの計算」でした。

プロフィール
さき

ポケモンの乱数調整とかツールとか。サンムーン乱数調整できました。
Twitter→@water_blow

広告
最新コメント
記事検索