在C ++ 11中引入了函数std::shuffle:
template< class RandomIt, class URNG >
void shuffle( RandomIt first, RandomIt last, URNG&& g );
并且它与std::random_shuffle的重载之一具有相同的签名,这也是在C ++ 11中引入的:
template< class RandomIt, class RandomFunc >
void random_shuffle( RandomIt first, RandomIt last, RandomFunc&& r );
区别在于第三个参数:
这是全部吗?差异只是URNG必须符合UniformRandomNumberGenerator的要求
shuffle
执行额外的编译时间检查吗?行为是否相同?
答案 0 :(得分:20)
std::random_shuffle
使用std::rand()
函数随机化项目,而std::shuffle
使用urng
这是一个更好的随机生成器,但具有{{1}的特定重载},你可以获得相同的行为(与std::random_shuffle
一样),但这需要你做一些工作来传递第三个参数。
观看Stephan T. Lavavej的演讲,他解释了为什么std::shuffle
是一个糟糕的函数以及C ++程序员应该使用的内容:
要点是,std::rand
是对std::shuffle
的改进,而C ++程序员应该更喜欢使用前者。
答案 1 :(得分:14)
如果您仔细阅读cppreference.com上的文档,您会发现传递给RandomFunc
的{{1}}有一个不同的界面。它被调用为random_shuffle
。这在C ++ 11之前就已存在。
r(n)
使用标准化方式获取随机数并调用std::shuffle
。这个标准化的随机数生成器,与C ++ 11和g()
一起引入。