Is it modern C++ to use srand to set random seed?

时光毁灭记忆、已成空白 提交于 2019-12-04 17:28:13

问题


For code that uses std::random_shuffle, I need to set a random seed so that the pseudorandom sequences produced vary in each program run.

The code example here makes a call to

srand ( unsigned ( time (NULL) ) );

which needs to

#include <ctime>
#include <cstdlib>

I wonder: Since C++11 includes major updates to pseudorandom number generation, is this still up to date? What should I use to set the random seed for std::random_shuffle?


回答1:


random_shuffle uses an implementation-defined random number generator unless you provide one. So, no, using srand is not necessarily correct.

Otherwise it uses the generator you provide. You can use rand if you want to be sure that is what gets used.

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>

However, I recommend using the new <random> facilities instead of rand(). Example follows.

std::default_random_engine gen(seed);

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



回答2:


If you are using C++11, think about using std::shuffle instead of std::random_shuffle, and passing a random-number generator, as in the last example here




回答3:


If you really care about accuracy, quality and diversity of the ways to generate random numbers, I would highly suggest to consider using the famous Gnu Scientific Library (GSL)

This allows real uniform generation and various algorithms for the best. See here.

Specially this and this describes the available algorithms :

— gsl_rng_mt19937
— gsl_rng_taus
— gsl_rng_taus2
— gsl_rng_gfsr4
...

EDIT : Also boost::random should be a good alternative considering the GPLness of GSL (but I never dealed with it...).



来源:https://stackoverflow.com/questions/14441680/is-it-modern-c-to-use-srand-to-set-random-seed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!