Maison >développement back-end >C++ >Comment générer des nombres vraiment aléatoires en C : `rand()` est-il suffisant ?

Comment générer des nombres vraiment aléatoires en C : `rand()` est-il suffisant ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-24 00:21:20289parcourir

How to Generate Truly Random Numbers in C  :  Is `rand()` Enough?

Comment générer des nombres vraiment aléatoires en C

Lors du développement d'applications nécessitant la génération de nombres aléatoires, comme dans les jeux de lancer de dés , il est crucial de s'assurer que les nombres produits sont véritablement aléatoires et non biaisés en faveur de certaines valeurs.

L'extrait de code présenté dans la question utilise la fonction rand() pour générer des nombres aléatoires dans une plage donnée. Cependant, comme observé dans le résultat, le même nombre a été généré à plusieurs reprises, indiquant un manque de caractère aléatoire.

Problème :

Le problème vient de l'utilisation du modulo opérateur (%) pour mapper le nombre aléatoire à une plage spécifique. Bien que cette approche puisse sembler pratique, elle peut introduire un biais en fonction de la mise en œuvre du générateur de nombres aléatoires.

Solution :

Pour résoudre ce problème et générer des nombres véritablement aléatoires en C , il est recommandé d'utiliser les fonctionnalités introduites dans C 11. Le code suivant démontre une approche alternative :

#include <random>
#include <iostream>

int main() {
    std::random_device dev;
    std::mt19937 rng(dev());
    std::uniform_int_distribution<std::mt19937::result_type> dist6(1, 6);  // distribution in range [1, 6]

    std::cout << dist6(rng) << std::endl;
}

Dans ce code, le La classe std::random_device fournit une source d'entropie pour initialiser le générateur de nombres aléatoires Mersenne Twister (std::mt19937). La classe std::uniform_int_distribution crée un objet de distribution dans la plage souhaitée ([1, 6] dans ce cas).

Lors de l'appel de dist6(rng), un entier véritablement aléatoire dans la plage spécifiée est généré. En adoptant ces fonctionnalités C 11, les développeurs peuvent obtenir plus de caractère aléatoire et éviter des résultats biaisés dans leurs applications.

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