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

cls*_*udt 15 c++ random srand c++11

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

这里代码示例调用

srand ( unsigned ( time (NULL) ) );
Run Code Online (Sandbox Code Playgroud)

这需要

#include <ctime>
#include <cstdlib>
Run Code Online (Sandbox Code Playgroud)

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

R. *_*des 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>
Run Code Online (Sandbox Code Playgroud)

但是,我建议使用新<random>设施而不是rand().示例如下.

std::default_random_engine gen(seed);

std::shuffle(first, last, gen);
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果您对随机数的分布和质量没有任何特殊要求,那么使用`std :: default_random_engine`代替`std :: mt19937`可能会更好,而不是搞乱执行PRNG本身(最后只有一个人了解MT的行为以及为什么他需要一个人关心它实际上是一个MT). (3认同)
  • @cls对不起,我弄错了.您根本不需要分发.std :: shuffle处理它.只需播种一个发电机并传递它. (2认同)