2009-03-05 9 views
2

Je cherche un moyen de générer une chaîne à 4 chiffres (assez) unique (non auto-incrémentée) en utilisant les chiffres 0 - 9 pour chaque chiffre en utilisant C#. Je peux valider l'unicité et générer un autre nombre si un dup est trouvé. J'avais pensé à baser le nombre en quelque sorte sur la propriété Ticks de l'objet DateTime mais j'ai du mal à assembler les pièces.Comment générer une chaîne à 4 chiffres unique

Toute idée ou expertise serait grandement appréciée.

Répondre

9

S'il ne s'incrémente pas lui-même, comment cela va-t-il être unique la deuxième fois? Est-ce que vous dites que vous voulez générer une chaîne aléatoire à 4 chiffres à partir de l'ensemble de toutes les chaînes à 4 chiffres inutilisées possibles? Si tel est le cas, l'approche correcte consiste généralement à générer toutes les chaînes à 4 chiffres possibles et à les mélanger dans un ordre aléatoire. Ensuite, prenez-les dans l'ordre car vous en avez besoin de nouveaux.

CLARIFICATION: D'autres réponses suggèrent simplement de générer une chaîne aléatoire à 4 chiffres et de la laisser à cela. Vraisemblablement, vous vérifieriez alors s'il était déjà utilisé et en généreriez un autre s'il est utilisé. Cela a le potentiel d'avoir une performance extrêmement sous-optimale. Supposons que vous ayez déjà utilisé 9999 (toutes sauf une) des chaînes de 4 chiffres possibles allant de 0000 à 9999. Pour générer le dernier, cette méthode peut prendre beaucoup, beaucoup d'essais.

+0

Idéalement, j'aimerais avoir une valeur unique au monde. Le problème est que je veux un très petit nombre de chiffres (disons 4 ou 5) en utilisant seulement des valeurs numériques entre 0 et 9 pour chacun. Je voudrais quelque chose comme GUID en ce que je tire pour une petite probabilité de collisions. – goombaloon

+0

@unknown: Eh bien, la probabilité d'une collision est de 1/10000 (au début) et ne fait qu'empirer à mesure que vous utilisez vos identifiants. Finalement, vous aurez une très forte probabilité de collision, et vous n'aurez plus d'ID. –

+0

Si les collisions sont possibles, générez la liste entière de 10 000 valeurs, mélangez-les et commencez à les distribuer. Jusqu'à ce que vous utilisiez tous les 10 000, tout le monde en aura un unique. Quand vous arrivez à la fin, recommencez depuis le début, et les nouveaux auront 1 collision; – mquander

-1

Générez quatre nombres aléatoires de 0 à 9, puis effectuez une concaténation de chaîne sur eux.

-3
Random randomNumberGenerator = new Random(); 
return string.Concat(
    randomNumberGenerator.Next(0, 9), 
    randomNumberGenerator.Next(0, 9), 
    randomNumberGenerator.Next(0, 9), 
    randomNumberGenerator.Next(0, 9)); 
1

Créer un tableau de toutes les valeurs 10000, en utilisant le type court, puis shuffle il.

+0

Cela a été suggéré comme la réponse à un autre problème sur ce site. C'est une bonne suggestion. Créez une table de nombres dans un ordre aléatoire et chaque fois que vous avez besoin d'une nouvelle chaîne aléatoire, choisissez-en une dans la table et supprimez-la. –

0

Dépend de vos besoins. Combien d'entre vous espérez-vous générer? Si vous en avez juste besoin de quelques centaines, vous pouvez générer un nombre aléatoire de 0 à 9999. Si vous prévoyez de générer tous les 10 000, alors vous devriez faire quelque chose comme Earwicker et maintenir une liste de toutes les valeurs inutilisées.

Je vous suggère de commencer par l'algorithme le plus simple (choisissez un nombre aléatoire de 1 à 9999), et de l'utiliser jusqu'à ce qu'il soit trop lent. Puis retournez et mettez dans Earwicker.

Questions connexes