对于使用std::random_shuffle
的代码,我需要设置一个随机种子,以便在每个程序运行中产生的伪随机序列不同。
srand ( unsigned ( time (NULL) ) );
需要
#include <ctime>
#include <cstdlib>
我想知道:由于C ++ 11包含伪随机数生成的主要更新,这仍然是最新的吗?我应该使用什么来设置std::random_shuffle
的随机种子?
答案 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 Library
(GSL)
这样可以实现真正的统一生成和各种算法。请参阅here。
— gsl_rng_mt19937
— gsl_rng_taus
— gsl_rng_taus2
— gsl_rng_gfsr4
...
编辑:考虑到GSL的GPL性,boost::random也应该是一个不错的选择(但我从未用它来处理......)。