# "初期Seed厳選"における最適戦略の考察
(数学的な表記として正しくないものも含まれています. ご承知おきください.)
## 序文
乱数調整の手法は大きく二つに分かれる.
1. 初期Seed生成の脆弱性を突いて初期Seedそのものを操作することで目的のSeedを得る方法.
2. 乱数生成器の脆弱性を突いて初期Seedを特定[^initseed]し, その後の乱数消費の操作によって目的Seedを得る方法.
[^initseed]:厳密には現在Seedを特定する場合もあるが, 説明の都合上初期Seedとして統一している.
2番目の手法を用いる際, 最初に引いていた初期Seedに依って目的Seedを得るまでに超長時間の操作を要求されることがある. 目的Seedの出現頻度が余りに少ない場合に起こりがちな問題で, 乱数消費の操作時間が短く済む初期Seedを引けるまでソフトリセットを繰り返す"初期Seed厳選"をすることで対処することが多い.
このとき, どのような戦略(基準)にそって初期Seedを採択すれば, 目的Seedを得るまでにかかる時間を最小化出来るかを考察する.
## 事前条件
乱数生成器の周期が十分に大きく, 各出力が独立であると見做してよいことを仮定する. すなわち, 目的Seedの出現確率が消費数によらず常に$p$として良いものとする.
## 初期Seed厳選のモデリング
初期Seedから目的Seedまでに必要な消費数を$a$[**adv**]として, 閾値$U$[**adv**]に対して$a<U$を満たすならばその初期Seedを採択するという戦略を考える.
一回の試行にかかる時間(初期Seedを得るまでにかかる1回あたりの時間)を$C$[**s**], 乱数消費速度を$A$[**adv/s**]とする.
このとき, 試行回数$N$[**回**]で条件を満たす初期Seedを得られたのであれば, 最終的に目的Seedを得るまでにかかった時間$T$[**s**]は
\begin{align}
T = NC + \frac{a}{A} ~ \cdots(1)
\end{align}
と表される.
## 厳選時間の期待値計算
目的Seedを得るまでに掛かった時間の期待値$E(T)$を考える.
式$(1)$より, $C, A$が定数と見なせることに注意すると, 期待値の線形性を用いることで
\begin{align}
E(T)
&= E(NC + \frac{a}{A})\\
&= E(N)\cdot C + E(a)\cdot \frac{1}{A} ~ \cdots(2)
\end{align}
と変形できる.
### 試行回数の期待値
初期Seed厳選は, 一回の試行において初期Seedが採択される確率$p_{accept}$を成功確率とするベルヌーイ試行といえる. $p_{accept}$は, $U$回消費を行うまでに目的Seedが出現する確率だから,
\begin{align}
p_{accept} = 1 - (1-p)^U
\end{align}
として表せる.
ベルヌーイ試行を成功するまで繰り返したとき, その試行回数は幾何分布に従うことが知られており[^geometric], 幾何分布の期待値は元となるベルヌーイ試行の成功確率の逆数となる.
すなわち
\begin{align}
E(N) = \frac{1}{p_{accept}} = \frac{1}{1 - (1-p)^U}
\end{align}
が導かれる.
[^geometric]:https://bellcurve.jp/statistics/course/6988.html
### 消費数の期待値
また, 初期Seedから目的Seedまでの消費数$a$の期待値は$U$のみに依存して決まる. 初期Seedの事前条件により, $a$は$0$から$U-1$までの離散一様分布に従うと見做してよい[^reroll]ため,
\begin{align}
E(a) = \frac{U}{2}
\end{align}
と導かれる.
[^reroll]: "5以上の目が出たら振りなおす, とした場合のさいころの出目が$\{1,2,3,4\}$上の一様分布に従う" と類推解釈が可能.
### 総括
以上より,
\begin{align}
E(T) = C\cdot \frac{1}{1 - (1-p)^U} + \frac{U}{2A}
\end{align}
が得られる.
$(p,C,A)$を固定して考えることで, $E(T)$は$U$についての関数$f(U)$と見做せる. 従って所与の問題はこの関数の最適化問題に帰着される.
## 実験
パラメータを用意して期待値を計算する. 今回はそれぞれ
- $C = 300$
- $A = 1.2$
- $p = \frac{1}{1000000}$
とした[^experiment].
[^experiment]:BDSPにおいて`g7TID`の1点狙いをする場合のモデル.
### プロット
$f(U)$の計算式を [Wolfram Alphaに投入する](https://www.wolframalpha.com/input?i=f%28U%29+%3D+300+*+%281%2F%281-%281-1%2F1000000%29%5EU%29%29+%2B+%28U+%2F+%282+*+1.2%29%29%2C+from+0+to+100000&lang=ja) と次のようになる.

### 最小値
Wolfram Alphaは最小値の計算も出来る. [実際に解かせてみる](https://ja.wolframalpha.com/input?i=%E6%A5%B5%E5%80%A4%E8%A8%88%E7%AE%97%E6%A9%9F&assumption=%22FSelect%22+-%3E+%7B%7B%22GlobalExtremaCalculator%22%7D%7D&assumption=%7B%22F%22%2C+%22GlobalExtremaCalculator%22%2C+%22curvefunction%22%7D+-%3E%22300+*+%281%2F%281-%281-1%2F1000000%29%5EU%29%29+%2B+%28U+%2F+%282*1.2%29%29%22&assumption=%7B%22F%22%2C+%22GlobalExtremaCalculator%22%2C+%22domain%22%7D+-%3E%220%3CU%22)と以下の通り.

実験より, $E(T)$の最小値を与える閾値$U$が求められた.
(以上, 常体終わり)
## 所感
最小値($U = 26832$)付近を拡大してみてみるとこんな感じの見た目をしてます.

あまり小さすぎる閾値を設定すると所要時間は跳ね上がる一方で, 大きい閾値を設定すると線形増加するので, 上手く設定してあげると幸せになれそうです.
ともあれ, きちんとパラメータを与えれば良さそうな閾値$U$を決められることが分かって満足です.
### 追記
$E(T)$の最小値を与えるような$\overline{U}>0$をパラメータ$(C, A, p)$から計算できないかとアレコレ考えていたのですが, どうやら
\begin{align}
\overline{U} \approx \sqrt{\frac{2CA}{p}}
\end{align}
が良い近似を与えることが分かりました. ~~大学数学か何かで出てきそうな近似ですね.~~
~~残念ながら証明は出来ていないのですが, 腕に覚えがある方は挑戦してみてください.~~
ただのマクローリン近似でした.
$|p|$が充分に小さい時,
\begin{align}
E(T)=f(U) &\approx C \cdot \frac{1}{1-(1-pU)} + \frac{U}{2A} \\
&= \frac{C}{pU} + \frac{U}{2A}
\end{align}
となるので, 代わりにこの関数の最小値を求めることで所与の値が導出されます.