Maison > développement back-end > C++ > La nouvelle bibliothèque aléatoire est-elle vraiment meilleure que `std::rand()` ?

La nouvelle bibliothèque aléatoire est-elle vraiment meilleure que `std::rand()` ?

Susan Sarandon
Libérer: 2024-10-31 07:03:30
original
539 Les gens l'ont consulté

Is the New Random Library Really Better Than `std::rand()`?

Pourquoi la nouvelle bibliothèque aléatoire est-elle meilleure que std::rand() ?

Dans le célèbre exposé « rand() considéré comme dangereux », en utilisant le moteur de distribution Le paradigme de génération de nombres aléatoires est préconisé par rapport à la simplification classique du module std::rand() plus.

Pour tester les affirmations faites, une expérience comparant std::rand() avec std::mt19937 plus std:: uniform_int_distribution, a été réalisée :

  1. Deux fonctions, getRandNum_Old et getRandNum_New, ont été conçues pour générer des nombres aléatoires entre 0 et 5 en utilisant les deux méthodes.
  2. 960 000 nombres aléatoires ont été générés en utilisant les deux approches. , et les fréquences des nombres 0 à 5 ont été comptées.
  3. Les écarts types des fréquences ont été calculés pour 1000 simulations.
  4. Le temps pris pour les deux méthodes a également été enregistré.

Étonnamment, la répartition globale des rouleaux était égale pour les deux méthodes, ce qui suggère que std::mt19937 plus std::uniform_int_distribution n'apportaient aucune uniformité supplémentaire. Cependant, la nouvelle méthode était environ 4 fois plus lente.

Bien que cette expérience semble indiquer que std::rand() n'est pas nécessairement inférieur, il est important de considérer les limitations inhérentes à std::rand() :

  • Il utilise un générateur congruentiel linéaire (LCG), connu pour présenter certaines faiblesses telles qu'un faible caractère aléatoire des bits de poids faible, une période courte et un RAND_MAX limité.
  • Le L'interface srand limite le nombre de graines de départ (et donc de séquences générées) car elle prend un entier non signé.

En revanche, le nouveau en-tête dans la bibliothèque standard C :

  • Fournit des algorithmes entièrement spécifiés avec des caractéristiques garanties.
  • Encapsule les générateurs dans des classes, éliminant l'état global et les problèmes associés.
  • Comprend un random_device par défaut pour l'amorçage.
  • Permet la mise en œuvre de générateurs personnalisés si vous le souhaitez.

En termes de performances, il est suggéré que std::minstd_rand peut être un remplacement approprié pour std ::mt19937 lorsque la qualité LCG est suffisante, offrant potentiellement une meilleure vitesse (notamment en évitant l'ajustement de la distribution à l'aide de uniform_int_distribution).

En fin de compte, le choix du générateur de nombres aléatoires dépend des exigences spécifiques de l'application, mais le nouveau La bibliothèque offre plusieurs avantages par rapport à l'ancienne implémentation std::rand(), en particulier pour les applications qui exigent des nombres aléatoires de haute qualité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal