8

c++11 のライブラリは移植可能ですか? 移植性がないと聞いたので、rand() を避けてきました。

4

3 に答える 3

17

「ポータブル」をどのように定義しますか?

「ポータブル」とは、「同じ入力が与えられた乱数のバイナリ同一シーケンスを生成する」ことを意味する場合、はい、randポータブルではありません。そして、はい、C++ 乱数発生器は移植可能です (それらのほとんどはstd::default_random_engineorではありません)。特定のアルゴリズムstd::random_deviceを実装しているためです。乱数ジェネレーターとまったく違うものでない限り、何でもかまいません。rand

そうは言っても、@PeteBeckerが指摘したように、分布自体はあまり明確に定義されていません. したがって、std::mt19937は特定のシードに対して同じ値のシーケンスを生成しますが、異なるstd::uniform_int_distributions は同じ入力シーケンスと範囲に対して異なる値を与えることができます。

もちろん、一貫性が必要な場合は、いつでも独自のディストリビューションを定義できます。

于 2013-02-12T20:11:59.110 に答える
6

で説明されている乱数エンジンには、<random>移植性を確保するためのアルゴリズムの明示的な要件があります。ディストリビューションはそうではありません。

于 2013-02-12T20:47:24.960 に答える
2

たとえば、 std::mt19937 (Mersenne Twister)を使用して、(@ Nicol Bolas から)「同じ入力が与えられた乱数の同一シーケンス」を生成できます。あなたは間違いなくそれを行うことができませんでしrand()た.

関連する質問:

于 2013-02-12T20:50:54.013 に答える