乱数ジェネレーターをシードすることに加えてrand()
、可能であれば完全に避けることをお勧めします。これは通常、非常に優れた pRNG ではなく、一般的な使用法 ( などrand() % size
) では偏った結果が生成されます。より良い代替手段があれば、標準の C++<random>
ライブラリを使用することをお勧めします。
<random>
以上のいくつかの利点rand()
:
- さまざまなニーズに合わせて明確に定義された特性を持ついくつかのエンジン。
- 独自のディストリビューションを作成するよりも正しく使用する方が簡単です。
- スレッド化されたプログラムで明確に指定された動作。
例:
#include <random>
#include <iostream>
#include <functional>
int main() {
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 e(seed);
int size = 10;
std::uniform_int_distribution d(1,size);
std::cout << d(e) << '\n';
}
使用法に適している場合は、すべてを単一の関数オブジェクトにバインドすることもできます。
#include <functional>
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
auto rand = std::bind(std::uniform_int_distribution<>(1,size),
std::mt19937(seed));
std::cout << rand() << '\n';