2010-09-28 14 views
1

Générer un mot de passe aléatoire est facile. mais générer un lot est plus difficile.générer un lot de mots de passe aléatoires

public static string getRandomPassword(int letters, int getallen) { 
     //int letters = 8; 
     //int getallen = 5; 

     char[] letterdeel = new char[letters]; 
     int minGetal = (int)Math.Pow(10, getallen - 1); 
     int maxGetal = (int)Math.Pow(10, getallen); 

     string password; 
     Random r = new Random(); 
     int test = (int)(DateTime.Now.Ticks); 
     for (int i = 0; i < letters; i++) { 
      r = new Random((int)(DateTime.Now.Ticks) + i); 
      bool capital = r.Next(2) == 0 ? true : false; 
      if (capital) { 
       letterdeel[i] = (char)r.Next(65, 91); 
      } else { 
       letterdeel[i] = (char)r.Next(97, 123); 
      } 
     } 

     password = new string(letterdeel); 
     password += r.Next(minGetal, maxGetal); 

     return password; 
    } 

Ceci est ma méthode, les mots de passe doivent être dans un certain format de lettre-nombre. cela fonctionne très bien, mais si j'ai une boucle for tirant 100 mots de passe de cette méthode, dans mon tableau j'ai 5-8 les mêmes mots de passe, puis encore 5-8 le même passage.

je sais POURQUOI c'est, à cause de la fonction aléatoire et de l'horloge dont elle dépend, mais comment résoudre ce problème?

Répondre

0

Utilisez un ensemble plutôt que n'importe quelle collection dans laquelle vous stockez et ne bouclez pas 100 fois mais jusqu'à ce que l'ensemble comporte 100 éléments.

5

Déplacez Random r vers l'extérieur de la méthode si vous l'appelez de manière répétée. Vous allez le frapper plusieurs fois dans le même laps de temps relatif, de sorte que vous allez générer les mêmes graines. Vous voulez également vous débarrasser de la ligne ci-dessous. Il est inutile, et (encore une fois), with the nature of DateTime.Now, vous continueriez simplement à générer la même séquence de nombres "aléatoires". Définissez votre générateur de nombres aléatoires comme étant statique à l'extérieur de la fonction.

r = new Random((int)(DateTime.Now.Ticks) + i); 
+0

est pourquoi j'ajouté 'I' à lui. le placer à l'extérieur était en effet la meilleure option. – Stefanvds

+0

Oui, mais à titre d'explication, l'ajout de «i» entraîne toujours les mêmes graines et séquences. Considérons que 'DateTime.Now' serait inchangé à travers plusieurs appels de méthode. Disons, par exemple, que DateTime.Now.Ticks était 0 lors du premier appel de méthode par souci d'argument. Pour les premières exécutions de cette méthode, il arrivera si vite que DateTime.Now n'a pas été mis à jour avec une nouvelle valeur (voir l'article de blog). Donc, votre boucle à l'intérieur de la méthode passe toujours par 0, 1, 2, 3, 4, etc. Mêmes graines pour chaque exécution de la méthode, même séquence produite par l'objet Random. –