Maison > développement back-end > C++ > Pourquoi la `` bibliothèque en C est-elle préférée à `rand()` ?

Pourquoi la `` bibliothèque en C est-elle préférée à `rand()` ?

DDD
Libérer: 2024-11-03 17:00:03
original
221 Les gens l'ont consulté

Why is the `` library in C   preferred over `rand()`?

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

Les préoccupations contemporaines concernant rand() ont suscité des discussions sur l'utilisation d'un nombre aléatoire supérieur procédures de génération (RNG) basées sur le paradigme de distribution de moteur, par opposition à l'approche conventionnelle std::rand() et modulo. Pour avoir une compréhension directe des lacunes de rand(), une expérience rapide a été menée.

Deux fonctions ont été créées, getRandNum_Old() et getRandNum_New(), exploitant std::rand() et std : :mt19937 avec std::uniform_int_distribution respectivement, pour générer des nombres aléatoires entre 0 et 5. 960 000 nombres aléatoires ont été générés en utilisant chaque méthode et la fréquence de chaque nombre (0-5) a été enregistrée. L'écart type a servi de mesure, une valeur inférieure indiquant une distribution plus uniforme. Le processus a été réitéré 1 000 fois et le temps nécessaire à chaque itération a été mesuré.

Étonnamment, la répartition des rouleaux était similaire dans les deux méthodes. La nouvelle méthode était environ 4 fois plus lente. Il est apparu que le gain de vitesse se faisait au prix d'une amélioration minime de la qualité.

Cependant, une distinction cruciale réside dans la mise en œuvre du RNG elle-même. De nombreuses implémentations de rand() utilisent des générateurs congruentiels linéaires (LCG), qui ne sont généralement pas les plus robustes. Malgré leur prévalence, ils produisent généralement des résultats acceptables dans des tests de base comme celui effectué.

Les défauts des implémentations médiocres de rand() incluent un faible caractère aléatoire dans les bits de poids faible, des périodes courtes, un RAND_MAX faible et une corrélation entre les extractions. Cependant, il est crucial de noter que ces limitations ne sont pas inhérentes à l'API rand().

Le problème sous-jacent avec rand() se concentre sur :

  1. Compatibilité ascendante : Modifier les implémentations existantes romprait la reproductibilité dans les programmes reposant sur srand avec une graine fixe.
  2. Interface simpliste : rand() fournit un générateur unique et global. Bien qu'il soit adapté aux cas d'utilisation de base, il pose des défis dans les applications multithread et les scénarios nécessitant des séquences reproductibles.

Le nouveau La bibliothèque répond à ces préoccupations en proposant :

  • Implémentations spécifiées : sortie reproductible entre compilateurs croisés et caractéristiques garanties.
  • État de l'art générateurs : encapsulés dans des classes pour éviter les problèmes d'état globaux.
  • Appareil aléatoire : installations d'ensemencement.

En termes de performances, std::mt19937 ( utilisé par std::rand() dans votre test) est plus lent que std::minstd_rand (un LCG également disponible dans la bibliothèque ). L'utilisation de std::minstd_rand avec une implémentation similaire à getRandNum_Old() peut permettre une exécution plus rapide (6 ms contre 8,61 ms pour rand()).

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal