为什么c++14把random_shuffle标为deprecated
random_shuffle有两种形式,即
template<class RandomAccessIterator>
void random_shuffle(RandomAccessIterator first, RandomAccessIterator last);
和
template<class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
RandomNumberGenerator&& rnd);
二者被deprecated(即不推荐使用)的原因并不一样。
前者使用编译器指定的随机数发生器来打乱数组的内容,这个随机数发生器通常是rand函数,它被deprecated的原因也和rand函数有关。由于rand函数是C语言的遗留产物,不同编译器实现方法不一样,产生随机数的可靠性也千差万别,并且C++11提供了一整套明确规定了算法的随机数发生器(位于<random>头文件)。有人提议把rand函数标为deprecated,来让更多的人使用C++11提供的“更好的东西”。使用rand函数的random_shuffle也被连带标为deprecated。
后者要求rnd仿函数(只能是仿函数)产生的随机数的范围就是数组的下标范围,这样的仿函数通常不是很容易写,完全可以被更好的东西代替——这个更好的东西就是shuffle函数
shuffle函数与random_shuffle的第二种形式相似,同样是接受一个仿函数,但对随机数的范围要求更松,因而可以直接传一个std::mt19997对象,或者std::random_device对象(都是C++11直接提供的随机数发生器)的进去,更便于使用,同时不像rand一样,不能保证打乱结果的可靠性
2014-03-05
我曾经写的个求数独的程序靠random_shuffle提升了n倍的性能
CZ,话说支持C++14的编辑器/IDE有内些?