shuffle和random_shuffle c ++有什么区别

时间:2013-10-07 08:04:11

标签: c++ c++11 c++-standard-library

在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执行额外的编译时间检查吗?行为是否相同?

2 个答案:

答案 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()一起引入。