Maison > développement back-end > C++ > Pourquoi l'utilisation répétée de « srand() » dans une fonction C conduit-elle à des résultats non aléatoires ?

Pourquoi l'utilisation répétée de « srand() » dans une fonction C conduit-elle à des résultats non aléatoires ?

Mary-Kate Olsen
Libérer: 2024-12-30 08:49:09
original
272 Les gens l'ont consulté

Why Does Repeatedly Using `srand()` in a C   Function Lead to Non-Random Results?

Utiliser rand() pour générer des valeurs vraiment aléatoires dans une fonction

En C, utiliser rand() pour générer des nombres aléatoires dans une seule la fonction peut entraîner des valeurs récurrentes. Ce problème survient lorsque srand() est invoqué à plusieurs reprises avant chaque appel à rand().

Problème :

Considérez l'exemple que vous avez fourni :

string PullOne()
{
    string pick;
    string choices[3] = {"BAR", "7", "cherries"};

    std::srand(time(0));
    pick = choices[(std::rand() % 3)];
    return pick;
}
Copier après la connexion

Lorsque vous appelez PullOne() plusieurs fois depuis main(), vous vous attendez à des valeurs aléatoires distinctes pour pull_1, pull_2 et pull_3. Cependant, vous obtenez systématiquement des résultats identiques.

Solution :

Pour remédier à cela, déplacez l'invocation de srand() en dehors de la fonction PullOne() et placez-la une fois au début de votre programme. Ce faisant, vous initialisez le générateur de nombres aléatoires une fois, garantissant qu'une séquence véritablement aléatoire est produite pour les appels rand() suivants.

// srand() is now called only once, at program initialization.
int main()
{
    std::srand(time(0));

    string pull_1, pull_2, pull_3;
    pull_1 = PullOne();
    pull_2 = PullOne();
    pull_3 = PullOne();

    return 0;
}
Copier après la connexion

Explication :

srand () définit la graine du générateur de nombres aléatoires. Lorsque la même graine est utilisée à plusieurs reprises, le générateur produit la même séquence. En initialisant srand() une fois, la graine est cohérente tout au long du programme, conduisant à une sortie prévisible et non aléatoire de rand().

Par conséquent, il est crucial d'appeler srand() une seule fois, idéalement pendant le programme. initialisation ou au début du processus de génération de nombres aléatoires. Cela garantit la génération de nombres véritablement aléatoires au sein de votre fonction.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal