Frage

Ich brauche einen Block von einzigartigen Linien zu schaffen ein anderes Projekt zu testen, arbeite ich an.

Also habe ich ein einfaches Programm, eine zufällige Folge von X Länge zu erzeugen.

Das Problem ist, dass, wenn ich es einmal nennen, ich eine zufällige Zeichenfolge zu bekommen, wenn ich es wieder aufrufen (in einer for-Schleife zum Beispiel) ich die gleiche Zeichenfolge für die gesamte Ausführung der Schleife erhalten.

Ich habe das Gefühl, dass es zwischengespeichert oder etwas Wesen, aber ich wusste nicht, .net das tat, und ich bin gerade an dieser Stelle verwirrt.

Telefonvorwahl:

    StreamWriter SW = new StreamWriter("c:\\test.txt");
    int x = 100;
    while (x >0)
    {
        SW.WriteLine(RandomString(20));
        x--;
    }

hier ist die Methode:

private static string RandomString(int Length)
{
    StringBuilder sb = new StringBuilder();
    Random randomNumber = new Random();

    for (int i = 0; i <= Length; ++i)
    {
        int x = randomNumber.Next(65, 122);
        sb.Append(Convert.ToChar(x));
    }
    return sb.ToString();        
}

und hier ist die Ausgabe:

"VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
..................
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB"

Also, was gibt dachte ich Random.next () würde eine neue Zufallszahl immer wieder zurückkehren?

War es hilfreich?

Lösung

Sie schaffen die Random Instanzen zu nahe in der Zeit. Jede Instanz wird initialisiert den Systemtakt verwendet wird, und als die Uhr haben Sie die gleiche Folge von Zufallszahlen nicht geändert bekommen immer und immer wieder.

Erstellen Sie eine einzelne Instanz der Random Klasse und verwenden Sie es immer und immer wieder.

Mit dem using Schlüsselwort, so dass die StreamWriter geschlossen ist und angeordnet ist, wenn Sie mit ihm fertig sind. Der Code für eine Schleife ist leichter zu erkennen, wenn Sie das for Schlüsselwort verwenden.

using (StreamWriter SW = new StreamWriter("c:\\test.txt")) {
   Random rnd = new Random();
   for (int x = 100; x > 0; x--) {
      SW.WriteLine(RandomString(rnd, 20));
   }
}

Das Verfahren führt das Random Objekt als Parameter.

Verwenden Sie auch die Länge der Stringbuilder mit der richtigen Kapazität zu initialisieren, so dass es nicht während der Schleife neu zu verteilen hat. Verwenden Sie den Operator length Parameter gibt.

private static string RandomString(Random rnd, int length) {
   StringBuilder sb = new StringBuilder(length);
   for (int i = 0; i < length; i++) {
      int x = rnd.Next(65, 122);
      sb.Append((char)x);
   }
   return sb.ToString();        
}

Andere Tipps

Siehe Zufällige Konstruktor Beschreibung bei MSN, diesen Teil:

  

Der Standardstartwert wird abgeleitet aus   der Systemtakt und hat finite   Auflösung. Als Ergebnis verschiedener   Zufällige Objekte, die erstellt werden   dichte Folge durch einen Aufruf an den   Standardkonstruktor haben   identische Standardstartwerte und,   Daher werden identische Sätze erzeugen   von Zufallszahlen.

Also entweder rufen Sie den Random () Konstruktor nur einmal am Anfang des Programms oder verwenden Sie den Random (int32) Konstruktor und definieren Sie sich einen unterschiedlichen Samen.

Da Sie ein neues Random-Objekt in jedem Aufruf erstellen.

Sie einfach die random aus dem Verfahren bewegen und es ist ein Klassenmitglied machen.

private Random randomNumber = new Random();
private static string RandomString(int Length)
{
    StringBuilder sb = new StringBuilder();
    //...
}

Alle Software Zufallsgeneratoren sind ‚pseudo random‘, erzeugen sie eine Folge von Zahlen Basen auf einer (Ausgangs-) Samen. Mit dem gleichen Samen produzieren sie die gleiche Sequenz. Manchmal ist dies sehr nützlich. Wenn Sie produzieren Ihr Programm soll auf jedem Lauf die gleiche Sequenz zu erzeugen, können Sie new Random(0) verwenden.

Edit: offenbar die .Net Zufall Klasse ist auto-Seeding, ich wusste nicht, dass. So ist es ein Timing-Problem, wie andere haben darauf hingewiesen.

nur erklären random einmal



public class MyClass
{
    private static Random randomNumber = new Random();

    private static string RandomString(int Length)
    {
        StringBuilder sb = new StringBuilder();  

        for (int i = 0; i ... Length; ++i)
        {
        int x = MyClass.randomNumber.Next(65, 122);
        sb.Append(Convert.ToChar(x));
        }
        return sb.ToString();        
    }
}

das Saatgut für die Zufallszahlen sind alle gleich aufgrund der kurzen Zeit es braucht in der Tat Sie den Zufallsgenerator mit dem gleichen Samen, jedes Mal neu erstellt, so dass die Next () Aufruf denselben Zufallswert zurückgibt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top