2010-08-25 8 views
3

J'essaie de générer une chaîne d'une longueur aléatoire qui consiste en char s aléatoire.essayer de créer une chaîne de valeurs aléatoires

Pour ce faire, j'ai ce code:

class Program 
{ 
    static void Main(string[] args) 
    { 
     for (int i = 0; i < 1000; i++) 
     { 
      MyString test = new MyString(); 

      test.Random(); 
      Console.WriteLine(test.Value); 
     } 
     Console.ReadLine(); 
    } 
} 

public class MyString 
{ 
    private string value = string.Empty; 
    private Random r = new Random(); 

    public string Value 
    { 
     get { return this.value; } 
     set { this.value = value; } 
    } 

    public void Random() 
    { 
     int length = (r.Next() % (100)) + 1; 
     for(int i = 0; i < length; i++) 
     { 
      value = value + RandomChar(); 
     } 
    } 

    public char RandomChar() 
    { 
     // 32 to 126 
     int c = (r.Next() % 95) + 32; 
     char ch = (char)c; 
     return ch; 
    } 
} 

Maintenant, permet de regarder une partie de la sortie:

alt text

Comme vous pouvez le voir, la sortie est loin d'être aléatoire , il contient beaucoup de chaînes répétitives. Comment est-ce possible et comment le résoudre?

+4

C'est la chose au sujet de hasard, vous ne pouvez jamais savoir si ce n'est pas au hasard. – NullUserException

+1

Cette image est très difficile à lire. –

+1

Random.Next a trois surcharges, au moins l'un d'entre eux devrait vous intéresser: http://msdn.microsoft.com/en-us/library/13td4hz1.aspx – Tergiver

Répondre

11

Il semble que vous créez une instance nouvelle de la classe Random chaque fois que votre constructeur MyString est appelé. La classe Random se plante probablement en fonction de l'heure actuelle (à une certaine résolution). Les générateurs de nombres aléatoires avec la même valeur généreront la même séquence pseudo-aléatoire.

La solution consiste à construire un instance de Random et l'utiliser partout.

+0

Bonne réponse. De la doc: "Cependant, parce que l'horloge a une résolution finie, l'utilisation du constructeur sans paramètre pour créer différents objets aléatoires en succession rapprochée crée des générateurs de nombres aléatoires qui produisent des séquences identiques de nombres aléatoires." http://msdn.microsoft.com/en-us/library/system.random.aspx –

+4

+1 Comme solution miracle, pensez à rendre votre instance 'Random' statique - cela changera probablement la distribution des caractères car il y a une seule instance 'Random'. –

+0

w0w! C'est une réponse rapide: D Merci, ça marche très bien maintenant! – user341877

Questions connexes