C ++ <random>
機能を実用的なプログラムで使用するとします(「実用的」の定義については、ここでの制約はこの質問の一部です)。おおよそ次のようなコードがあります。
int main(int argc, char **argv) {
int seed = get_user_provided_seed_value(argc, argv);
if (seed == 0) seed = std::random_device()();
ENGINE g(seed); // TODO: proper seeding?
go_on_and_use(g);
}
私の質問は、あなたはどのタイプを使うべきですENGINE
か?
私はいつも
std::mt19937
タイプするのが速くて名前認識があったのでいつも言っていました。しかし最近では、みんなが言っているように、メルセンヌツイスターは非常にヘビー級でキャッシュに不向きで、他の人が行うすべての統計的検定にさえ合格していません。std::default_random_engine
それは明らかな「デフォルト」なので言いたいのですが。しかし、それはプラットフォームによって異なりあれば、私にはわからない、とそれは統計的にどんな良いことだかどうかはわかりません。最近は誰もが64ビットプラットフォームを使用
std::mt19937_64
しているので、少なくともover を使用する必要がありstd::mt19937
ますか?私が言いたい
pcg64
かxoroshiro128
、彼らは尊敬と軽量に見えるので、彼らは内に存在しない<random>
すべてで。私は約何も知らない
minstd_rand
、minstd_rand0
、ranlux24
、knuth_b
確かに彼らは何のために良いことがあります- 、など?
明らかに、ここにはいくつかの競合する制約があります。
エンジンの強さ。(
<random>
暗号的に強力なPRNGはありませんが、一部の標準化されたものは他のものよりも「弱い」ですよね?)sizeof
そのエンジン。その速度
operator()
。播種のしやすさ。
mt19937
初期化する状態が非常に多いため、適切にシードするのが難しいことで有名です。ライブラリベンダー間の移植性。あるベンダー
foo_engine
が別のベンダーとは異なる数値を生成する場合foo_engine
、それは一部のアプリケーションには適していません。(うまくいけば、これは多分それ以外を除外しませんdefault_random_engine
。)
これらすべての制約をできる限り考慮して、究極の「標準ライブラリ内にとどまるベストプラクティス」の答えは何でしょうか。を使い続けるべきstd::mt19937
ですか、それとも何ですか?