Maison  >  Article  >  développement back-end  >  Génération de nombres aléatoires en C++

Génération de nombres aléatoires en C++

WBOY
WBOYoriginal
2023-08-22 12:10:516147parcourir

Génération de nombres aléatoires en C++

La génération de nombres aléatoires est une partie importante de la programmation informatique. En programmation C++, les nombres aléatoires sont également très courants et peuvent être utilisés pour simuler des données, générer des données de test, développer des jeux, etc. Cet article présentera plusieurs méthodes de génération de nombres aléatoires en langage C++.

Génération de nombres pseudo-aléatoires

L'algorithme de génération de nombres pseudo-aléatoires est une méthode de génération de nombres aléatoires utilisée dans la plupart des programmes. Il ne s'agit pas d'un vrai nombre aléatoire, mais d'un nombre pseudo-aléatoire généré par un certain algorithme mathématique. En C++, vous pouvez utiliser la fonction rand pour générer des nombres pseudo-aléatoires. La fonction

rand est définie dans le fichier d'en-tête stdlib.h. Il renvoie un nombre aléatoire de type int, allant de 0 à RAND_MAX défini dans le fichier d'en-tête stdlib.h, et sa valeur est généralement 32767.

Exemple de code :

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{
    // 设置随机数种子
    srand(time(0));
    
    // 生成10个随机数
    for(int i = 0; i < 10; i++)
    {
        cout << rand() << endl;
    }
    
    return 0;
}

Dans le code ci-dessus, la fonction srand est utilisée pour définir la graine de nombre aléatoire, et time(0) peut obtenir le nombre de secondes de l'heure actuelle, de sorte que les résultats de l'exécution du programme soient différent à chaque fois. Utilisez ensuite une boucle for pour générer 10 nombres aléatoires et affichez-les à l’écran.

Il convient de noter que chaque fois que la fonction rand est appelée, elle renverra un nombre aléatoire unique, mais si elle est appelée plusieurs fois, il y aura un certain degré de corrélation entre les nombres aléatoires. Par conséquent, lorsque vous utilisez la fonction rand pour générer un grand nombre de nombres aléatoires, d'autres méthodes doivent être utilisées pour l'obscurcissement.

Véritable génération de nombres aléatoires

Les vrais nombres aléatoires font référence à des nombres aléatoires générés par des phénomènes physiques. Par exemple, les données d'ondes sismiques ou les caractéristiques photoélectriques peuvent être collectées via des dispositifs matériels. Cependant, ces dispositifs matériels sont très coûteux et ne conviennent pas à la plupart. Pour les applications, il suffit d'utiliser un algorithme de génération de nombres pseudo-aléatoires.

Cependant, certains scénarios d'application nécessitent des nombres aléatoires de haute sécurité Afin de protéger la sécurité et la confidentialité des données, de vrais nombres aléatoires doivent être utilisés. Dans ce cas, un périphérique externe peut être utilisé pour fournir de vrais nombres aléatoires. Par exemple, de vrais nombres aléatoires peuvent être générés en lançant des dés, en lançant des pièces, en tirant au sort, etc., mais cette méthode est non seulement inefficace, mais génère également des types limités de nombres aléatoires.

La méthode la plus courante consiste à générer des nombres véritablement aléatoires via un appareil physique appelé générateur de nombres aléatoires (RNG). Il génère des nombres aléatoires en collectant des processus physiques ou des procédures mathématiques imprévisibles, tout en fournissant également des fonctionnalités de sécurité supplémentaires. Cependant, le coût d’utilisation d’un véritable générateur de nombres aléatoires est beaucoup plus élevé que celui d’un algorithme de génération de nombres pseudo-aléatoires.

Génération de nombres aléatoires en C++ 11

C++ 11 fournit une nouvelle bibliothèque de nombres aléatoires, comprenant deux parties : Premièrement, un générateur de nombres pseudo-aléatoires, comprenant plusieurs algorithmes qui peuvent mieux répondre aux besoins de divers scénarios d'application, et le second est un véritable générateur de nombres aléatoires, qui peut accéder aux installations matérielles spécialement générées par le système et renvoyer de vrais nombres aléatoires.

Les bibliothèques de génération de nombres aléatoires en C++ 11 incluent :

  • minstd_rand0 : générateur congruentiel linéaire
  • minstd_rand : générateur congruentiel linéaire amélioré
  • mt19937 : générateur Mersenne Twister 19937 avec de meilleures performances et une durée d'exécution plus longue
  • mt19937 _64 : Générateur Mersenne Twister 19937, renvoie un entier 64 bits
  • ranlux24_base : générateur LUX (level, uniform, eXcellent), fonctionne rapidement et de haute qualité
  • ranlux48_base : générateur LUX (level, uniform, eXcellent), renvoie des entiers 48 bits, fonctionne rapidement et a un nombre élevé quality
  • knuth_b : générateur Knuth-B (T, P), génère des séquences aléatoires différentes du standard, avec une qualité supérieure

Utilise des nombres aléatoires en C++ 11 Lors de la génération de la bibliothèque, vous devez inclure le fichier d'en-tête aléatoire, et vous pouvez utiliser les fonctions uniform_int_distribution et uniform_real_distribution pour contrôler la plage et le type de nombres aléatoires.

Exemple de code :

#include <iostream>
#include <random>

using namespace std;

int main()
{
    // 以当前时间作为种子
    default_random_engine engine(time(nullptr));
    
    // uniform_int_distribution:以等概率生成min到max范围内的整数
    uniform_int_distribution<int> distribution(0, 100);
    cout << distribution(engine) << endl;
    
    // uniform_real_distribution:以等概率生成min到max范围内的浮点数
    uniform_real_distribution<double> r_distribution(0, 100);
    cout << r_distribution(engine) << endl;

    return 0;
}

Dans le code ci-dessus, default_random_engine est utilisé pour générer des valeurs de départ de nombres aléatoires, et les plages de nombres aléatoires entiers et à virgule flottante générés sont spécifiées respectivement dans uniform_int_distribution et uniform_real_distribution. Enfin, des nombres aléatoires sont générés en appelant la fonction moteur.

Conclusion

Ci-dessus sont plusieurs méthodes courantes de génération de nombres aléatoires en C++. Différents scénarios d'application nécessitent différentes méthodes de génération de nombres aléatoires, et vous devez choisir la méthode appropriée en fonction de la situation réelle. Dans la programmation réelle, vous pouvez combiner les avantages des nombres pseudo-aléatoires et des vrais nombres aléatoires et utiliser certaines méthodes avancées de génération de nombres aléatoires pour améliorer l'efficacité et la sécurité du programme.

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