レイド乱数の少し踏み込んだ解説
table:RaidRNGSystem
日時 seed EC OTID PID V固定1 個体値1 個体値2 個体値3 個体値4 個体値5 …
塊を投げた S(0) → R_0(0) R_0(1) R_0(2) R_0(3) R_0(4) R_0(5) R_0(6) R_0(7) R_0(8) …
1日経過 S(1) → R_1(0) R_1(1) R_1(2) R_1(3) R_1(4) R_1(5) R_1(6) R_1(7) R_1(8) …
2日経過 S(2) → R_2(0) R_2(1) R_2(2) R_2(3) R_2(4) R_2(5) R_2(6) R_2(7) R_2(8) …
3日経過 S(3) → R_3(0) R_3(1) R_3(2) R_3(3) R_3(4) R_3(5) R_3(6) R_3(7) R_3(8) …
4日経過 S(4) → R_4(0) R_4(1) R_4(2) R_4(3) R_4(4) R_4(5) R_4(6) R_4(7) R_4(8) …
ここでのseedは所謂"DenSeed". Xoroshiroの初期化に使われる値で, Xoroshiroから得られる乱数値Rとは異なる.
Xoroshiro-inverseは個体値等の情報からSを逆算する.
PIDとか個体値とかを決定するのに使われるのはRのほう.
柱が生えたタイミングでS(0)が決定. 以後セーブデータにseedが保持される.
日付変更のタイミングでseedが更新される. 更新はS(n+1) = S(n) + (ある定数)で行われる.
Xoroshiroの更新はビット演算で行われる(数値をベクトルと見なして行列を掛けていると考えても良い. その場合はR(n+1) = T*R(n)).
簡単に言うと, S(1)で初期化されたR_1の情報を集めても, S(0)で初期化されたR_0の情報を求めるのは非常に困難ということ.
pattirudonさんが「R_nの連続した個体値情報+αから, 初期化に使われたS(n)を現実的な時間で求める方法」を編み出してくださったおかげで、中身を覗かなくても乱数調整ができるようになった.
2V以上だと観測できる個体値が減るので困る.
table:3V固定の時の例
seed EC OTID PID V固定1 V固定2 V固定2-再計算 V固定3 個体値1 個体値2 個体値3 …
S(n) → R(0) R(1) R(2) R(3) R(4) R(5) R(6) R(7) R(8) R(9) …
4日目以降のV固定回数を変動させられることを利用して, 個体値の観測箇所を無理やり増やす.
table:4V固定の時の例
seed EC OTID PID V固定1 V固定2 再計算 V固定3 再計算 再計算 V固定4 個体値1 個体値2 …
S(n) → R(0) R(1) R(2) R(3) R(4) R(5) R(6) R(7) R(8) R(9) R(10) R(11) …
都合よく上の例のようになれば, R(7) ~ R(11)の計5箇所分の個体値が観測できたことになる.
table:4V固定の時のダメな例
seed EC OTID PID V固定1 V固定2 再計算 V固定3 V固定4 個体値1 個体値2 …
S(n) → R(0) R(1) R(2) R(3) R(4) R(5) R(6) R(7) R(8) R(9) …
このように, 再計算が都合よく起こらなかった場合は, 個体値を観測できている箇所が増えていないのでダメ.