Maison >développement back-end >C++ >Comment puis-je générer des entiers aléatoires uniformément distribués en C ?

Comment puis-je générer des entiers aléatoires uniformément distribués en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-24 20:17:11855parcourir

How Can I Generate Uniformly Distributed Random Integers in C  ?

Génération d'entiers aléatoires uniformément distribués

Lors du développement de logiciels, la génération d'entiers aléatoires dans une plage spécifiée est une tâche courante. Cependant, trouver un générateur de nombres aléatoires rapide et uniformément distribué peut s’avérer difficile. Dans cet article, nous abordons ce problème en explorant diverses approches pour générer des entiers aléatoires dans une plage donnée.

Une approche simple

Une méthode courante pour générer des entiers aléatoires consiste à utiliser rand() fonction. Cependant, comme indiqué dans la question initiale, rand() peut conduire à une distribution biaisée, notamment pour les petites plages.

Pour résoudre ce problème, une formule alternative a été proposée :

( (max - min) * rand() + (RAND_MAX / (2 * (max - min))) ) / RAND_MAX

Bien que cette formule fournisse une distribution plus uniforme, elle ne répond toujours pas à toutes les exigences, à savoir la vitesse, la distribution uniforme, les plages variables et la possibilité d'amorçage.

La bibliothèque standard C pour le Rescue

Présentation de la fonction de bibliothèque standard C std::uniform_int_distribution et de son générateur de nombres aléatoires associé std::mt19937. Cette approche est simple, rapide et fournit des résultats impartiaux.

#include <random>

std::random_device rd;
std::mt19937 rng(rd());
std::uniform_int_distribution<int> uni(min,max);

auto random_integer = uni(rng);

Le std::random_device initialise le générateur avec une véritable source d'entropie, garantissant que les nombres générés sont imprévisibles et aléatoires. Le std::uniform_int_distribution définit la plage d'entiers à générer, garantissant que toutes les valeurs dans cette plage ont une probabilité égale d'être sélectionnées.

Cette approche remplit toutes les exigences :

  • Vitesse : l'implémentation de la bibliothèque standard est très efficace, même pour générer de grandes quantités de nombres aléatoires.
  • Distribution uniforme : la La fonction std::uniform_int_distribution assure une distribution impartiale et uniforme des nombres générés.
  • Plages variables : la distribution peut être personnalisée sur n'importe quelle plage d'entiers en définissant les paramètres min et max.
  • Seedability : Le paramètre rd fournit un moyen d'amorcer le générateur avec une valeur spécifique, permettant une reproductibilité.

A Solution supérieure

En conclusion, l'approche la plus simple et la meilleure pour générer des entiers aléatoires uniformément distribués en C consiste à utiliser les fonctions std::uniform_int_distribution et std::mt19937. Cette approche exploite les algorithmes optimisés de la bibliothèque standard, garantissant à la fois vitesse et caractère aléatoire.

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!

Déclaration:
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