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
945 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:

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();
        }
    }
}
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!

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