15

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

这里的代码示例调用

srand ( unsigned ( time (NULL) ) );

这需要

#include <ctime>
#include <cstdlib>

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

4

3 回答 3

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);
于 2013-01-21T15:19:40.610 回答
3

如果您使用的是 C++11,请考虑使用std::shuffle而不是std::random_shuffle,并传递一个随机数生成器,如最后一个示例所示

于 2013-01-21T15:21:12.963 回答
0

如果您真的关心生成随机数的方法的准确性、质量和多样性,我强烈建议您考虑使用著名的Gnu Scientific Library( GSL )

这允许真正的统一生成和最佳的各种算法。见这里

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

— gsl_rng_mt19937
— gsl_rng_taus
— gsl_rng_taus2
— gsl_rng_gfsr4
...

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

于 2013-05-29T06:00:26.447 回答