【问题标题】:Is it modern C++ to use srand to set random seed?使用 srand 设置随机种子是现代 C++ 吗?
【发布时间】:2013-01-21 15:17:29
【问题描述】:

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

code example here 拨打电话

srand ( unsigned ( time (NULL) ) );

需要

#include <ctime>
#include <cstdlib>

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

【问题讨论】:

标签: c++ random c++11 srand


【解决方案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>

但是,我建议使用新的 &lt;random&gt; 工具而不是 rand()。示例如下。

std::default_random_engine gen(seed);

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

【讨论】:

  • 你能提供一个代码示例吗?我很难理解到底该怎么做。
  • @cls 我举了一个例子。
  • 谢谢。我应该将lohi 设置为什么?
  • @cls 抱歉,我弄错了。您根本不需要分发。 std::shuffle 处理这个问题。只需播种一个生成器并传递它。
  • 或者,如果您对随机数的分布和质量没有任何特殊要求,您可能会更好地使用std::default_random_engine 而不是std::mt19937,而不是搞乱实现PRNG 本身(最终,只有了解 MT 的行为方式以及他为什么需要一个了解它实际上是 MT 的人才会关心它实际上是 MT)。
【解决方案2】:

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

【讨论】:

  • 采用RandomFunc&amp;&amp; rrandom_shuffle 版本与shuffle 有何不同?
  • @Dave 它需要一个函数,当调用 r(n) 时,它会返回区间 [0, n) 中的随机数。
【解决方案3】:

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

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

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

— gsl_rng_mt19937
— gsl_rng_taus
— gsl_rng_taus2
— gsl_rng_gfsr4
...

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

【讨论】:

  • 它是 GPLed,这可能是个问题。
  • 是的,我还没有对此深思熟虑,因为我也是 GPL 的 ;-)
猜你喜欢
  • 1970-01-01
  • 2020-04-07
  • 2016-07-13
  • 2014-11-21
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
相关资源
最近更新 更多