對於使用std::random_shuffle
的代碼,我需要設置一個隨機種子,以便在每個程序運行中產生的僞隨機序列不同。使用srand設置隨機種子是現代C++嗎?
srand (unsigned (time (NULL)));
調用它需要
#include <ctime>
#include <cstdlib>
我想知道:由於C++ 11包括主要更新僞隨機數生成,這是仍然是最新的?我應該用什麼來設置std::random_shuffle
的隨機種子?
對於使用std::random_shuffle
的代碼,我需要設置一個隨機種子,以便在每個程序運行中產生的僞隨機序列不同。使用srand設置隨機種子是現代C++嗎?
srand (unsigned (time (NULL)));
調用它需要
#include <ctime>
#include <cstdlib>
我想知道:由於C++ 11包括主要更新僞隨機數生成,這是仍然是最新的?我應該用什麼來設置std::random_shuffle
的隨機種子?
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);
如果你真的關心準確性,質量和多樣性的方式來產生隨機數,我強烈建議考慮使用着名的Gnu Scientific Library
(GSL)
這使得真正的均勻生成和各種算法的最佳。請參閱here。
— gsl_rng_mt19937
— gsl_rng_taus
— gsl_rng_taus2
— gsl_rng_gfsr4
...
編輯:也boost::random應該考慮GSL的GPLness一個很好的選擇(但我從來沒有與它dealed ...)。
這是GPL,這可能是一個問題。 – user1095108
沒錯,我對此一點也不擔心,因爲我也是GPLed的; - ) –
另請參閱[爲什麼在C++ 14中不推薦使用std :: shuffle方法?](http://stackoverflow.com/q/22600100/1708801) –