shuffle和random_shuffle c ++有什么区别

Mar*_*dik 23 c++ c++-standard-library c++11

函数std :: shuffle已在C++ 11中引入:

template< class RandomIt, class URNG >
void shuffle( RandomIt first, RandomIt last, URNG&& g );
Run Code Online (Sandbox Code Playgroud)

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

template< class RandomIt, class RandomFunc >
void random_shuffle( RandomIt first, RandomIt last, RandomFunc&& r );
Run Code Online (Sandbox Code Playgroud)

不同之处在于第三个参数,其中:

URNG必须满足UniformRandomNumberGenerator的要求

这都是?差异只是shuffle执行额外的编译时间检查吗?这个行为是否相同?

Naw*_*waz 20

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++程序员应该更喜欢使用前者.

  • @MartinDrozdik它*可以*(和默认**). (3认同)
  • @Grizzly再次阅读.***默认***确实如此.我从来没有说过default-provider**是**`std :: rand()`.我说它*******使用*它.关于过载,"它"(即过载)是否完全取决于提供者(你),因此它可以***. (2认同)
  • +1和真正的要点是`<random>`是绝对的猫咪睡衣和头和尾巴比`rand()`更好. (2认同)
  • @TemplateRex:2013年10月在芝加哥举行的会议讨论了`rand()`的弃用.该提案获得了足够的动力,使其进入正式动议页面.然而,如果没有正式投票,该议案就被提起来是如此具有争议性."将被弃用"是目前无人能说的.它有可能在C++ 14中被弃用.但是,如果我不得不以这种或那种方式下注,我会把钱放在它上面而不是在C++ 14中被弃用. (2认同)

Dan*_*rey 14

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

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