LoginSignup
5
4

More than 1 year has passed since last update.

PCG という乱数

Last updated at Posted at 2021-11-15

これは何?

公式サイト(?) にある乱数について軽く調べた記事。

色々ある

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件作るのに要する時間にしてみたのが下図。

1.png

続いて 64bit 生成する人の時間を半分にしたのが下図。

2.png

ばらつきの評価をしていないけど。
件数当たりなら pcg32_fast が速い。
ビット数あたりなら pcg64_fast が速い。

_fast がつかないやつに限定すると。
件数当たりなら xoshiro128++ が速い。
ビット数あたりなら pcg64_oneseq が速い。

という事になった。

結局何を使うか

雑にチャート作った。

image.png

まだ 32bit 環境で PCG を走らせていないので本当に 64bit 乗算の速さが効くのかどうか自信がないんだけど、暫定的にはこんな風に考えている。

もちろん、もっと長い周期が必要とかいろいろ個別の事情がある。そういう場合にはこういう雑なチャートを当てにせず、自分で考えるしかない。

それと。

あと。
上記のリストに入ってないけど 64ビット最適均等分布F2-線形発生法 という RNG も気になる気になる。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4