Maison > développement back-end > C++ > Pourquoi plusieurs instances Random.Next renvoient-elles des valeurs identiques?

Pourquoi plusieurs instances Random.Next renvoient-elles des valeurs identiques?

Susan Sarandon
Libérer: 2025-01-24 23:31:09
original
872 Les gens l'ont consulté

Why Do Multiple Random.Next Instances Return Identical Values?

Comprendre la génération de nombres aléatoires identiques en C #

Lors de la génération de nombres aléatoires dans une boucle en utilisant plusieurs instances d'une classe, vous pouvez observer que Random.Next() produit les mêmes valeurs à plusieurs reprises. Ce comportement découle de la façon dont la classe Random fonctionne.

La classe Random s'appuie sur une valeur de graines pour initier sa séquence de nombres pseudo-aléatoires. Si plusieurs instances Random sont créées en succession rapide, elles reçoivent souvent des valeurs de graines très similaires, résultant en des séquences de sortie identiques.

La solution: une instance aléatoire partagée

pour surmonter cela, au lieu de créer une nouvelle instance Random pour chaque objet de classe, créez une seule instance Random et partagez-la entre toutes les instances de votre classe. Cela garantit que chaque instance tire de la même séquence en évolution de nombres aléatoires.

Voici un exemple amélioré démontrant cette approche:

<code class="language-csharp">public class A
{
    private readonly Random _rnd;

    public A(Random rnd)
    {
        _rnd = rnd;
    }

    public void Count()
    {
        int r1 = _rnd.Next(-1, 1); // Note: Next(-1, 1) will only return -1 or 0.  To get -1, 0, or 1, use Next(-1, 2)
        int r2 = _rnd.Next(-1, 2); // Corrected to include 1
    }
}

public class B
{
    private readonly List<A> _listOfA = new List<A>();
    private readonly Random _rnd = new Random();

    public B()
    {
        // Populate _listOfA...  (Example below)
        for (int i = 0; i < 10; i++)
        {
            _listOfA.Add(new A(_rnd));
        }
    }

    public void Process()
    {
        foreach (var aClass in _listOfA)
        {
            aClass.Count();
        }
    }
}</code>
Copier après la connexion

En injectant l'instance partagée _rnd dans le constructeur de classe A, chaque instance A utilise le même générateur de nombres aléatoires, garantissant des nombres aléatoires distincts sur toutes les instances. Notez la correction dans Next(-1,2) pour inclure 1 dans les sorties possibles.

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