【问题标题】:What is the difference between shuffle and random_shuffle c++shuffle和random_shuffle c++有什么区别
【发布时间】:2013-10-07 08:04:10
【问题描述】:

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

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

【问题讨论】:

  • 顺便说一句,在标准中“X 必须满足 Y 的要求”并不意味着实现会检查它。这意味着如果 X 未能满足 Y 的要求,则行为未定义。在任何模板代码中都会有一些编译时检查,但通常只检查实现实际使用的接口 Y 的部分。

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


【解决方案1】:

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 它可以(并且默认可以)。
  • @Grizzly 再次阅读。 default 可以。我从来没有说过默认提供者 std::rand()。我说它确实 使用它。关于过载,“它”(即过载)是否完全取决于提供者(您),因此它可以
  • +1 而真正的主旨是&lt;random&gt; 绝对比rand() 更好的猫睡衣。
  • std::random_shuffle 使用您传递它的随机源,如果您不传递它,则使用一些实现定义的源。它不一定使用std::rand()std::rand() 不一定是一个坏函数;只是不能保证它是一个好的。
  • @TemplateRex:rand() 的弃用在 2013 年 10 月的芝加哥会议上进行了讨论。该提案获得了足够的动力,使其进入正式动议页面。然而,由于争议太大,该动议在未经正式投票的情况下被撤回。 “将被弃用”是目前没有人可以说的。它有可能在 C++14 中被弃用。但是,如果我不得不以一种或另一种方式下注,我会把我的钱放在它不会在 C++14 中被弃用。
【解决方案2】:

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

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

【讨论】:

  • +1 和 &lt;random&gt; 是很久以前的事了,我很高兴它做到了。我正在编写这个,示例代码和所有内容,但你的简报很好地涵盖了它。注意:r(n) 返回一个介于 0 和 (n-1) 之间的数字。
猜你喜欢
  • 2019-12-21
  • 2016-06-19
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多