使用srand设置随机种子是现代C ++吗?

时间:2013-01-21 15:17:30

标签: c++ random c++11 srand

对于使用std::random_shuffle的代码,我需要设置一个随机种子,以便在每个程序运行中产生的伪随机序列不同。

code example here拨打

srand ( unsigned ( time (NULL) ) );

需要

#include <ctime>
#include <cstdlib>

我想知道:由于C ++ 11包含伪随机数生成的主要更新,这仍然是最新的吗?我应该使用什么来设置std::random_shuffle的随机种子?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:3)

如果您使用的是C ++ 11,请考虑使用std::shuffle代替std::random_shuffle,并传递随机数生成器,如上一个示例here

答案 2 :(得分:0)

如果你真的关心产生随机数的方法的准确性,质量和多样性,我强烈建议考虑使用着名的Gnu Scientific LibraryGSL

这样可以实现真正的统一生成和各种算法。请参阅here

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

— gsl_rng_mt19937
— gsl_rng_taus
— gsl_rng_taus2
— gsl_rng_gfsr4
...

编辑:考虑到GSL的GPL性,boost::random也应该是一个不错的选择(但我从未用它来处理......)。