2 votes

Problèmes avec rand

J'ai un tel code : Le texte de la chaîne contient des {AVATAR}.

    if (text.Contains("{AVATAR}"))
        text = Regex.Replace(text, "{AVATAR}", m => rand_avatars());
public string rand_avatars()
{
    string[] text = avatars.ToArray();
    Random rand = new Random(DateTime.Now.Millisecond);
    return text[rand.Next(text.Length)];
}

Mais après avoir remplacé les avatars, je reçois deux chaînes de caractères identiques. Pourquoi ?

10voto

Matthew Watson Points 30804

C'est probablement parce que DateTime.Now.Millisecond n'a pas changé entre les appels, et la même graine est donc utilisée deux fois pour le générateur de nombres aléatoires.

Vous devez faire de l'objet Random un champ et l'initialiser une seule fois, puis le réutiliser dans le champ rand_avatars() .

Alternativement, initialisez-le une fois en tant que local avant d'effectuer le remplacement, et passez-le dans la fonction rand_avatars(Random random) (ayant ajouté Random comme paramètre à rand_avatars() ).

5voto

fero Points 2467

Utilisez le même Random et appeler simplement Next à chaque fois. Si vous créez un nouveau Random pour chaque nombre, vous obtiendrez des résultats similaires.

private Random _r = new Random();

void Foo()
{
    /// ...

    if (text.Contains("{AVATAR}"))
        text = Regex.Replace(text, "{AVATAR}", m => rand_avatars());

    /// ...
}

string rand_avatars()
{
    string[] text = avatars.ToArray();
    return text[_r.Next(text.Length)];
}

Edit : D'ailleurs, le if est inutile car Regex.Replace ne remplacera rien si le motif ne correspond pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X