LCGとMTの性質によるものをば。


◆LCG
最初知った時は目から鱗だったり。

●あるシードからあるシードまでの消費数の計算
1つずつ進めて一致するまででも計算できるが、これ使えば消費数が多くなっても高速に計算できる。
リンク先いけば実際に使ってる例も分かるかと。
消費数の多いXD乱数にも使えるのかしら。(やったことないけど)

●n個先のシードの計算
消費数が多くなると1つずつ進めるのは時間がかかるが、これを使うと消費数が多くなっても計算量はさほど増えない。
あるいはnを特定の値で使うのなら、r[k+n]=An*r[k]+BnなるAn、Bnを予め求めておけば以降シードを1つ進めるのと同様の計算量で計算できる。
後者はBW2孵化乱数用ツールで実装済み。


◆MT
テーブルの計算減らす以外の方法あったら教えて。

●必要部分のテーブルのみ計算
参照する部分がn、n+1、n+397とかなので、例えばMTの最初6つだけ必要ならn=0~5で必要になる部分、すなわち第0テーブルの0~6、397~402の部分だけ計算できればよい。
第0テーブルの決定方法から実質的に0~402だが(いい方法あるのかもしれんが)それでも全部計算するよりこの場合でも計算量402/624くらいにはなるんでなかろうか。
まあ、必要になったときにテーブル更新するようにしてれば勝手に実現できてるはず。
BW2孵化乱数用ツールで実装済み。

●テーブル自体計算しない
32bitの初期シードを設定すれば乱数列が決まるので、欲しい乱数列が出る初期シードを予め計算しておく。
初期シードは2^32通りしかないので変なことしてなければ1日あればまあ「準備として」初期シード計算できるんじゃないのかなー。
第5世代の消費数個体値指定(1/2^30)とか、対応する初期シードがあまり多くならずになおかつ良く使う奴に。
第5世代個体値乱数列初期シードリストにいくつか載せてある。


とりあえず知ってるのとか適当に挙げるとこんな感じ。
他なんか良さげなのあるかしら。