它是现代C ++使用函数srand设置随机种子?(Is it modern C++ to use s

2019-08-07 16:46发布

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

在此代码示例 ,使一个呼叫

srand ( unsigned ( time (NULL) ) );

这需要

#include <ctime>
#include <cstdlib>

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

Answer 1:

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>设施代替兰特()。 例子如下。

std::default_random_engine gen(seed);

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


Answer 2:

如果您正在使用C ++ 11,考虑使用std::shuffle ,而不是std::random_shuffle ,并通过随机数发生器,作为最后一个例子在这里



Answer 3:

如果你真的在乎精度,质量和产生随机数的方法的多样性,我会强烈建议考虑使用著名的Gnu Scientific Library ( GSL )

这使得真正的统一生成和最好的各种算法。 见这里 。

特别这和这描述了可用的算法:

— gsl_rng_mt19937
— gsl_rng_taus
— gsl_rng_taus2
— gsl_rng_gfsr4
...

编辑:另外的boost ::随机应考虑GSL的GPLness一个很好的选择(但我从来没有与它dealed ...)。



文章来源: Is it modern C++ to use srand to set random seed?