2013-01-21 18 views
15

std::random_shuffleを使用するコードでは、生成される疑似ランダムシーケンスがプログラム実行ごとに異なるようにランダムシードを設定する必要があります。srandを使ってランダムなシードを設定するのは現代のC++ですか?

code example here

#include <ctime> 
#include <cstdlib> 

に必要

srand (unsigned (time (NULL))); 

への呼び出しは、私は思ってしまう:C++ 11は、擬似乱数生成へのメジャーアップデートが含まれているので、最新の状態にまだこれですか? std::random_shuffleのランダムシードを設定するために何を使用すればよいですか?

+0

[なぜstd :: shuffleメソッドがC++ 14で非推奨になるのですか?](http://stackoverflow.com/q/22600100/1708801) –

答えて

25

random_shuffleは、ユーザーが定義した乱数ジェネレータを使用しない限り、実装定義の乱数ジェネレータを使用します。だから、いいえ、srandを使っても必ずしも正しいとは限りません。

それ以外の場合は、提供する発電機を使用します。使用されていることを確認したい場合はrandを使用できます。

srand(seed); 
std::random_shuffle(first, last, [](int n) { return rand() % n; }); 
// this is a biased generator 
// see <http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx> 

ただし、rand()の代わりに新しい<random>機能を使用することをおすすめします。例を次に示します。あなたが本当に正確性、品質を気にしている場合

std::default_random_engine gen(seed); 

std::shuffle(first, last, gen); 
+0

コードサンプルを提供できますか?私は何をすべきかを理解するのが難しい。 – clstaudt

+0

@cls私は例を挙げました。 –

+0

ありがとうございます。私は 'lo'と' hi'を何に設定すべきですか? – clstaudt

3

あなたがC++ 11を使用している場合は、最後の例here

+2

'RandomFunc && r'を' shuffle'と違う 'random_shuffle'のバージョンはどうですか? – David

+2

@Daveこの関数は、区間[0、n]の乱数を返すために 'r(n)'と呼ばれるときに必要となる関数です。 –

0

のように、std::shuffleを使用して代わりにstd::random_shuffle、および乱数ジェネレータを渡すことを考えますランダムな数を生成する方法の多様性、私は非常に有名人を使用して検討することをお勧めしますGnu Scientific LibraryGSL

これは本当に均一な生成と最高のための様々なアルゴリズムが可能です。 hereを参照してください。

特別thisthisは、使用可能なアルゴリズムを説明します

— gsl_rng_mt19937 
— gsl_rng_taus 
— gsl_rng_taus2 
— gsl_rng_gfsr4 
... 

EDIT:またboost::random(...しかしそれで、私はdealed決して)GSLのGPLnessを考慮すると良い代替する必要があります。

+2

GPLされています。これは問題の可能性があります。 – user1095108

+0

そうです、私はGPLed-likeのように、私はそれについてthaugthしていません;-) –

関連する問題