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世代個体値乱数列初期シードリストにいくつか載せてある。
とりあえず知ってるのとか適当に挙げるとこんな感じ。
他なんか良さげなのあるかしら。
◆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世代個体値乱数列初期シードリストにいくつか載せてある。
とりあえず知ってるのとか適当に挙げるとこんな感じ。
他なんか良さげなのあるかしら。
uint32_t s[3];
s[0] = 0;
s[1] = B;
s[2] = (A+1) * B;
while (1) { /* ループ終了条件は省略 */
/*
ここでs[0]がseed, s[1]が次のseed, s[2]が次の次のseedになっている
*/
s[0] += 1;
s[1] += A;
s[2] += A*A;
}