23

C++11 中引入了std::shuffle函数:

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

它与C++11 中引入的std::random_shuffle的重载之一具有相同的签名:

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

区别在于第三个参数,其中:

URNG 必须满足 UniformRandomNumberGenerator 的要求

这就是全部吗?差异只是shuffle执行额外的编译时间检查吗?其他行为是否相同?

4

2 回答 2

21

std::random_shuffle使用std::rand()函数来随机化项目,而std::shuffle使用urng是更好的随机生成器,尽管具有特定的重载std::random_shuffle,您可以获得相同的行为(与使用std::shuffle),但这需要您做一些工作来传递第三个参数。

观看 Stephan T. Lavavej 的演讲,他在演讲中解释了为什么std::rand是一个坏函数以及 C++ 程序员应该改用什么:

要点是,std::shuffle是对 的改进std::random_shuffle,C++ 程序员应该更喜欢使用前者。

于 2013-10-07T08:15:15.347 回答
14

如果您仔细阅读 cppreference.com 上的文档,您会发现RandomFunc传递的 torandom_shuffle具有不同的 interface。它被调用为r(n). 这在 C++11 之前就存在了。

std::shuffle使用标准化的方式获取随机数并调用g(). 这个标准化的随机数生成器与 C++11 一起引入std::shuffle

于 2013-10-07T08:17:26.260 回答