Maison >développement back-end >C++ >Pourquoi mon générateur de chaînes aléatoires produit-il des chaînes identiques et comment puis-je y remédier ?

Pourquoi mon générateur de chaînes aléatoires produit-il des chaînes identiques et comment puis-je y remédier ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-05 16:45:44587parcourir

Why Does My Random String Generator Produce Identical Strings, and How Can I Fix It?

Problème de cohérence du générateur de chaînes aléatoires

Énoncé du problème :

Un générateur de chaînes aléatoires présente comportement inattendu, produisant des chaînes identiques de quatre caractères lors de plusieurs invocations. La fonctionnalité souhaitée est de générer deux chaînes aléatoires distinctes.

Extrait de code :

private string RandomString(int size)
{
    StringBuilder builder = new StringBuilder();
    Random random = new Random();
    char ch;
    for (int i = 0; i < size; i++)
    {
        ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));                 
        builder.Append(ch);
    }

    return builder.ToString();
}

Résolution :

Le une incohérence résulte de la création d'une nouvelle instance de la classe Random dans la méthode RandomString. Il en résulte que la même valeur de départ est utilisée pour chaque invocation, générant des séquences identiques.

Solution :

Pour garantir un véritable caractère aléatoire, déplacez l'instanciation de la classe Random vers un champ statique :

private static Random random = new Random((int)DateTime.Now.Ticks);

Cela garantit qu'une seule instance du générateur de nombres aléatoires est utilisée tout au long de la durée de vie du programme. La valeur DateTime.Now.Ticks sert de graine unique, garantissant que chaque appel ultérieur à RandomString produit une chaîne aléatoire unique.

Code modifié :

private static Random random = new Random((int)DateTime.Now.Ticks);
private string RandomString(int size)
{
    StringBuilder builder = new StringBuilder();
    char ch;
    for (int i = 0; i < size; i++)
    {
        ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));                 
        builder.Append(ch);
    }

    return builder.ToString();
}

En implémentant ce changement, le générateur produira désormais deux chaînes :

// get 1st random string 
string Rand1 = RandomString(4);

// get 2nd random string 
string Rand2 = RandomString(4);

// creat full rand string
string docNum = Rand1 + "-" + Rand2;

Sortie :

UNTE-FWNU

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