Maison > Article > développement back-end > Pourquoi la `` bibliothèque en C est-elle préférée à `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 :
Le nouveau
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
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!