C++ 为什么std::shuffle方法在C++;14?

C++ 为什么std::shuffle方法在C++;14?,c++,c++11,deprecated,c++14,stl-algorithm,C++,C++11,Deprecated,C++14,Stl Algorithm,根据上的参考站点,以下方法在c++14中被弃用: template< class RandomIt > void random_shuffle( RandomIt first, RandomIt last ); 似乎不同的减速功能没有设置默认参数。这背后的原因是什么?是否添加了某种替代方案?std::random\u shuffle可以在后台使用randomC函数族。这些函数使用全局状态作为种子和其他状态 因此,它被弃用,因为shuffle也会做同样的事情,但会更好。也就是说,它使

根据上的参考站点,以下方法在c++14中被弃用:

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

似乎不同的减速功能没有设置默认参数。这背后的原因是什么?是否添加了某种替代方案?

std::random\u shuffle
可以在后台使用
random
C函数族。这些函数使用全局状态作为种子和其他状态


因此,它被弃用,因为
shuffle
也会做同样的事情,但会更好。也就是说,它使用了C++11中新的
头,该头不使用全局状态,而是使用生成器、设备和发行版来创建自己的对象。

被弃用,因为它的RNG未指定——不仅仅是您不必指定它,而是标准本身没有指定它。例如,在VC++上,它使用了
rand()
,但实现得非常糟糕

std::random\u shuffle
std::shuffle
有效地取代。您确实需要传递第三个参数(随机数生成器),但作为交换,您可以获得更好的定义和(通常)行为


std::random_shuffle
的定义相当糟糕。它通常使用
rand()
来生成随机数,但没有说明它是否调用了
srand
(如果调用了,则如何调用),因此您无法依赖(例如)在
rand
中按照您的意愿进行种子设定(如果进行了种子设定,则无法依赖于它的使用)。如果记忆有用的话,还有一些令人困惑的(有些自相矛盾的)语言可以解释为,
random\u shuffle
根本不能使用
rand
,和/或它不能用
srand
播种。即使充其量,
rand()
的许多实现也相当糟糕,因此即使充其量,您也无法依赖有用的结果


底线:
random\u shuffle
没有损失。使用
std::shuffle
,您的代码会更好。

我们可以在本文档中找到基本原理,其中说明:

因此,我们现在建议执行该计划的下一步,以阻止使用 传统的C函数rand及其相关的种子函数srand和上限宏 特别是RAND_MAX.6,我们建议通过正式否决以下内容开始这一过渡:

  • rand、srand和rand_MAX和
  • 算法random_shuffle()(但是保持shuffle)
不推荐使用random_shuffle()的理由是指定了一个重载以依赖于 在rand上,而另一个重载被指定为需要一个难以生成的分布 来自用户的对象;这样的分布已经是shuffle的一个隐含部分,我们保留它

以及后一份重申这一立场的文件

更新


正如Howard Hinnant指出的那样,
N3775
有一个错误:
rand\u shuffle()
允许但不要求在引擎盖下使用
rand()
,但这不会改变基本原理。

似乎还有第二个重载,接受RNG。。。“这个可以用吗?”@Mehrdad:我想可以,是的。它基本上相当于std::shuffle
。不过,我看不出有任何真正的理由喜欢它胜过
std::shuffle
random\u shuffle
中的
RandomNumberGenerator
shuffle
中的
UniformRandomNumberGenerator
有不同的API。后者的API符合[rand.req.urng]中的统一随机数生成器要求。前者仅在
random\u shuffle
的requires子句中指定了API
std::random\u shuffle
可以使用
rand
。不需要使用
rand
。有些实现可以,有些不可以。谢谢你的更正,我错了。很抱歉出现这种错误。N3775错误地说,
rand\u shuffle()
的指定依赖于
rand
。可以正确地说,它允许在
rand
之上实现。但是它不需要在
rand
@HowardHinnant之上实现。谢谢你指出这一点,我想知道cppreference为什么使用这种措辞,我应该自己在标准中查找它。
std::random_shuffle(v.begin(),v.end()); //no longer valid in c++14