使用和实用std :: shuffle?

时间:2013-07-18 13:30:34

标签: c++ c++11 random shuffle stl-algorithm

如果你看一下C ++ 11中随机shuffle的规范,有3个函数。我的问题是:典型的用途和优势是什么:

template< class RandomIt, class URNG >
void shuffle( RandomIt first, RandomIt last, URNG&& g );

与之相比:

template< class RandomIt >
void random_shuffle( RandomIt first, RandomIt last );

我的意思是,无论URNG是什么(均匀分布),结果都是相同的(从统计的角度来看)。我看到的唯一一点是,std::shuffle是安全的,而std::random_shuffle的重载则不是。{1}}。你能证实吗?

编辑:我认为URNG应该是一个统一的分布,但似乎没有编译。那么有人可以提供一个使用std::shuffle的小例子吗?

1 个答案:

答案 0 :(得分:2)

如评论中所述,std::shuffle采用随机数生成器(或标准发言中的引擎),而不是随机数分布< / em>的。不同的随机数发生器即使具有理论上均匀的分布,也具有不同的特征。

  • 随机伪随机 - 真随机数生成器使用某种外部熵源。伪随机生成器(PRNG)是严格确定的。
  • 效果 - 有些发电机比其他发电机快。
  • 内存使用 - 某些PRNG需要更多内存来存储其状态。
  • 期间长度 - 所有PRNG都有一个有限的时间段,之后它们从头开始重复相同的序列。有些人比其他人有更长的时间。
  • 随机性质量 - 有numerous tests用于衡量pseurorandom流中是否存在细微(或不那么微妙!)模式。例如,请参阅Diehard tests
  • 流是否为 cryptographically secure 。 AFAIK,没有标准的PRNG。

有关该标准提供的不同发电机的概述,请参阅http://en.cppreference.com/w/cpp/numeric/random