これは何?
公式サイト(?) にある乱数について軽く調べた記事。
色々ある
C++ 版の文書を見ると、色々ありすぎてよくわからなくなる。
色々について真面目に読んだ。
stream
乱数の系列のことだと思う。
メルセンヌ・ツイスタのような乱数は、1系列のとても長い数列があって、その数列の開始点を種で指定する感じ。
PCG の場合、系列がたくさんあって、開始点も自由に指定できる。この系列のことを stream と呼んでいるんだと思う。
K-dimensionally equidistribute
乱数としてのばらつきの良さを表す指標のひとつ。K が大きいほど良いんだと思う。
たとえば出力する値が 32bit の場合。
32bit の値を K 個ずつまとめると 32×K ビットなので、出てくるパターンは $2^{32K}$ 通りある。K-dimensionally equidistribute は「乱数を一周させたらこの $2^{32K}$ 通りのパターンが同じ回数ずつ出るよ」という意味。
必然的に、乱数の周期は $2^{32K}$ の倍数になる。
例えばメルセンヌ・ツイスタの場合、623-dimensionally equidistribute。32K=19936 なので、二回ずつ出るということだと思う。
PCG の場合、K=2, 32, 64 の三種類と特に言及のないものが用意されている。
例えば pcg32_k64
は、K=64。周期が $2^{2112}$。2112 は、32×64+64 なので、 $2^{64}$ 回ずつ出るということ。
もちろんこれは指標の一つに過ぎない。この一点をもって PCG より MT19937 が優れているということにはならない。
oneseq
名前に oneseq
が入っているものがある。ストリームが一個しかないという意味。
fast
名前に fast
が入っているものがある。名前のとおりちょっと速いらしい。
トレードオフとして、周期がちょっと短く、ストリームが一個しかなく、(全部じゃないかもしれないけど)ばらつきぐらあいがほんの少し悪いらしい。
その他にも
その他にも once
とか insecure
とか c
があるけど、ここでは省略。
私が使いそうなやつのリストアップ
下表の 2-DE とかは、 2-dimensionally equidistribute とかのこと。
名前 | 出力する値 | 特徴 | 周期 | ストリーム数 |
---|---|---|---|---|
pcg32 | 32-bit | $2^{64}$ | $2^{63}$ | |
pcg32_oneseq | 32-bit | $2^{64}$ | $1$ | |
pcg32_fast | 32-bit | $2^{62}$ | $1$ | |
pcg64 | 64-bit | $2^{128}$ | $2^{127}$ | |
pcg64_oneseq | 64-bit | $2^{128}$ | $1$ | |
pcg64_fast | 64-bit | $2^{126}$ | $1$ | |
pcg32_k2 | 32-bit | 2-DE | $2^{128}$ | $2^{63}$ |
pcg32_k2_fast | 32-bit | 2-DE | $2^{128}$ | $1$ |
pcg32_k64 | 32-bit | 64-DE | $2^{2112}$ | $2^{63}$ |
前述の公式サイトには倍以上あるけど、私が使いそうなのは上記かな。
計算内容
前述の公式サイトにある「*Really* minimal PCG32 code」を見ると、乱数を一個発生させるためには 整数の乗算、ビット演算(AND、OR、XOR、シフト、ローテート)が必要。
乗算が 64bit のようなので、32bit 環境(マイコンとか)では遅いかも。
ベンチマーク
軽い気持ちでいい加減なマイクロベンチマークしてみた。
0.1秒ぐらいまわして、1件作るのに要する時間にしてみたのが下図。
続いて 64bit 生成する人の時間を半分にしたのが下図。
ばらつきの評価をしていないけど。
件数当たりなら pcg32_fast
が速い。
ビット数あたりなら pcg64_fast
が速い。
_fast
がつかないやつに限定すると。
件数当たりなら xoshiro128++
が速い。
ビット数あたりなら pcg64_oneseq
が速い。
という事になった。
結局何を使うか
雑にチャート作った。
まだ 32bit 環境で PCG を走らせていないので本当に 64bit 乗算の速さが効くのかどうか自信がないんだけど、暫定的にはこんな風に考えている。
もちろん、もっと長い周期が必要とかいろいろ個別の事情がある。そういう場合にはこういう雑なチャートを当てにせず、自分で考えるしかない。
それと。
あと。
上記のリストに入ってないけど 64ビット最適均等分布F2-線形発生法 という RNG も気になる気になる。
以前書いた関連記事: