对于使用 的代码std::random_shuffle
,我需要设置一个随机种子,以便生成的伪随机序列在每个程序运行中都不同。
这里的代码示例调用
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);
如果您使用的是 C++11,请考虑使用std::shuffle
而不是std::random_shuffle
,并传递一个随机数生成器,如最后一个示例所示
如果您真的关心生成随机数的方法的准确性、质量和多样性,我强烈建议您考虑使用著名的Gnu Scientific Library
( GSL )
这允许真正的统一生成和最佳的各种算法。见这里。
— gsl_rng_mt19937
— gsl_rng_taus
— gsl_rng_taus2
— gsl_rng_gfsr4
...
编辑:考虑到 GSL 的 GPL 特性,boost::random也应该是一个不错的选择(但我从未处理过它......)。