58 votes

Pourquoi les méthodes std :: shuffle sont-elles obsolètes en C ++14?

Selon l' cppreference.com site de référence sur std::shufle, la méthode suivante est déprécié en c++14:

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

Pourquoi nous ne plus être en mesure d'appeler la fonction suivante sans passer par un troisième paramètre?

std::random_shuffle(v.begin(),v.end()); //no longer valid in c++14

Il ne semble pas comme si une autre fonction de la décélération a un paramètre par défaut défini. Quelle est la raison derrière cela? Y avait-il une sorte d'alternative ajoutée?

53voto

Germán Diago Points 1396

std::random_shuffle peut faire usage, sous le capot, d' random C la famille de fonctions. Ces fonctions utilisent de l'état global des semences et d'autres de l'état.

Donc, il est déconseillé, car shuffle font la même chose, mais en mieux. À savoir, il utilise le nouveau <random> - tête à partir de C++11 qui n'utilise pas d'état global, mais ses propres objets faisant usage de générateurs, dispositifs et des distributions.

EDIT: Correction. Comme Howard Hinnant dit, la mise en œuvre peut utiliser rand() sous le capot. Dans la pratique, je suppose, c'est ce que la mise en œuvre de l'aide depuis random_shuffle a été autour depuis avant c++11. De toute façon, je ne peux pas donner ma confirmation sur ce point, car il est dépendant de l'implémentation, mais le point est que les utilisateurs doivent utiliser l' shuffle et pas random_shuffle plus.

48voto

Jerry Coffin Points 237758

std::random_shuffle est (effectivement) remplacé par std::shuffle. Vous avez besoin de passer un troisième paramètre (un générateur de nombre aléatoire), mais en échange, pour que vous obtenez beaucoup plus de définition et (généralement) le comportement.

std::random_shuffle a été assez mal définie. Généralement utilisé rand() pour générer des nombres aléatoires, mais rien ne dit si (et si oui comment) il appelle srand, de sorte que vous ne pouvait plus compter (pour un exemple) en rand semées comment vous voulais (et si vous ensemencées il, vous ne pouviez pas dépendre que d'être mis à l'utilisation). Si ma mémoire est bonne, il y a aussi une confusion (et quelque peu contradictoire en soi) de la langue qui pourrait être interprété comme disant qu' random_shuffle ne pouvaient pas utiliser rand , et/ou qu'il ne pouvait pas la graine, il avec srand. Même au mieux, de nombreuses implémentations de rand() étaient assez pauvres, de sorte que même à très mieux que vous ne pouvait plus compter sur des résultats utiles.

Bottom line: random_shuffle n'est pas une perte. Utiliser std::shuffle au lieu de cela, et votre code sera beaucoup mieux pour elle.

16voto

Shafik Yaghmour Points 42198

Nous pouvons trouver la justification dans le présent document N3775: la Dépréciation du rand et ses Amis , qui dit:

Par conséquent, nous proposons à présent d'exécuter la prochaine étape de ce plan afin de décourager l'utilisation de la traditionnelle C de la fonction rand ainsi que ses associés de semis de la fonction srand et la limite supérieure de la macro RAND_MAX.6 En particulier, nous proposons de commencer cette transition par formellement déconseiller:

  • rand, srand, et RAND_MAX et
  • algorithme random_shuffle() (en gardant shuffle, cependant).

La justification de l'autodérision random_shuffle() est que l'on surcharge est spécifié de manière à dépendre sur rand, tandis que l'autre surcharge est spécifié de façon à exiger qu'un dur-à-distribution de produits objet de la part de l'utilisateur; une telle répartition est déjà une partie implicite de shuffle, que nous conservons.

et, plus tard, document Décourageant rand() en C++14, v2 , qui réitère cette position.

Mise à jour

Comme Howard Hinnant notes N3775 a une erreur: rand_shuffle() est autorisé mais pas obligatoire pour utiliser rand() sous le capot, mais cela ne changerait pas la justification.

6voto

Cory Nelson Points 10540

random_shuffle est obsolète car son RNG n'est pas spécifié - pas seulement parce que vous n'avez pas à le spécifier, mais que la norme elle-même ne le spécifie pas. Sur VC ++, par exemple, il utilise rand() , ce qui est très mal implémenté!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X