c++11 のライブラリは移植可能ですか? 移植性がないと聞いたので、rand() を避けてきました。
3 に答える
「ポータブル」をどのように定義しますか?
「ポータブル」とは、「同じ入力が与えられた乱数のバイナリ同一シーケンスを生成する」ことを意味する場合、はい、rand
ポータブルではありません。そして、はい、C++ 乱数発生器は移植可能です (それらのほとんどはstd::default_random_engine
orではありません)。特定のアルゴリズムstd::random_device
を実装しているためです。乱数ジェネレーターとまったく違うものでない限り、何でもかまいません。rand
そうは言っても、@PeteBeckerが指摘したように、分布自体はあまり明確に定義されていません. したがって、std::mt19937
は特定のシードに対して同じ値のシーケンスを生成しますが、異なるstd::uniform_int_distribution
s は同じ入力シーケンスと範囲に対して異なる値を与えることができます。
もちろん、一貫性が必要な場合は、いつでも独自のディストリビューションを定義できます。
で説明されている乱数エンジンには、<random>
移植性を確保するためのアルゴリズムの明示的な要件があります。ディストリビューションはそうではありません。
たとえば、 std::mt19937 (Mersenne Twister)を使用して、(@ Nicol Bolas から)「同じ入力が与えられた乱数の同一シーケンス」を生成できます。あなたは間違いなくそれを行うことができませんでしrand()
た.
関連する質問: