Génération d'entiers aléatoires uniformément distribués
Dans de nombreuses applications de programmation, générer des entiers aléatoires dans une plage spécifiée est une exigence courante. Cependant, garantir que ces entiers sont uniformément distribués présente un défi. Cet article explore diverses approches pour parvenir à une distribution uniforme.
Code existant et limitations
Le code fourni par l'utilisateur exploite la fonction rand() pour générer des nombres aléatoires dans un plage donnée. Cependant, cette approche souffre d'un manque d'uniformité, en particulier pour les petites plages telles que <0, 1>. Ceci est attribué à la faible probabilité que rand() renvoie RAND_MAX, la valeur maximale.
Formule proposée
Pour résoudre ce problème, l'utilisateur a conçu une nouvelle formule :
( (max - min) * rand() + (RAND_MAX / (2 * (max - min))) ) / RAND_MAX
Bien que cette formule vise à améliorer l'uniformité, elle reste insuffisante, comme en témoigne l'échantillonnage data.
Solution de bibliothèque standard C
La bibliothèque standard C fournit une solution élégante et fiable à ce problème. L'en-tête std::random comprend un ensemble de générateurs et de distributions de nombres aléatoires qui peuvent générer des nombres aléatoires avec une distribution uniforme.
#include <random> // Initialize random-number engine with a seed std::random_device rd; std::mt19937 rng(rd()); // Define uniform integer distribution std::uniform_int_distribution<int> uni(min, max); // Generate random integer within range auto random_integer = uni(rng);
Cette approche exploite un code bien testé et optimisé, garantissant une distribution et une efficacité uniformes. Cela élimine le besoin de réinventer la roue et les préoccupations concernant les préjugés ou les valeurs de départ.
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!