2013-01-21 37 views
15

對於使用std::random_shuffle的代碼,我需要設置一個隨機種子,以便在每個程序運行中產生的僞隨機序列不同。使用srand設置隨機種子是現代C++嗎?

code example here使得以

srand (unsigned (time (NULL))); 

調用它需要

#include <ctime> 
#include <cstdlib> 

我想知道:由於C++ 11包括主要更新僞隨機數生成,這是仍然是最新的?我應該用什麼來設置std::random_shuffle的隨機種子?

+0

另請參閱[爲什麼在C++ 14中不推薦使用std :: shuffle方法?](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> 

但是,我建議使用新的<random>設施而不是rand()。示例如下。

std::default_random_engine gen(seed); 

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

您能否提供一個代碼示例?我無法正確理解要做什麼。 – clstaudt

+0

@cls我包括一個例子。 –

+0

謝謝。我應該把'lo'和'hi'設置成什麼? – clstaudt

3

如果您正在使用C++ 11,考慮使用std::shuffle代替std::random_shuffle,並通過隨機數發生器,作爲最後一個例子here

+2

'RandomFunc && r'與'shuffle'不同的'random_shuffle'版本如何? – David

+2

@Dave它需要一個函數,當調用'r(n)'返回區間[0,n)中的一個隨機數時。 –

0

如果你真的關心準確性,質量和多樣性的方式來產生隨機數,我強烈建議考慮使用着名的Gnu Scientific LibraryGSL

這使得真正的均勻生成和各種算法的最佳。請參閱here

特別thisthis描述了可用的算法:

— gsl_rng_mt19937 
— gsl_rng_taus 
— gsl_rng_taus2 
— gsl_rng_gfsr4 
... 

編輯:boost::random應該考慮GSL的GPLness一個很好的選擇(但我從來沒有與它dealed ...)。

+2

這是GPL,這可能是一個問題。 – user1095108

+0

沒錯,我對此一點也不擔心,因爲我也是GPLed的; - ) –