2016-07-04 11 views
1

Ive erhielt eine Klasse Bevölkerung mit seinem Konstruktor:Warum bekomme ich im Debug-Modus Zufallszahlen?

private Individual[] m_population; 
    public Population() { 
     m_population = new Individual[POP_SIZE]; 
     for (int i = 0; i < POP_SIZE; i++) { 
      m_population[i] = new Individual(); 
      m_population[i].randGenes(); 
     } 
     //some other code here 
    } 

innerhalb der einzelnen Klasse I die Methode für randGenes haben():

Random rand2 = new Random((int) DateTime.Now.Ticks & 0x0000FFFF); 

     public void randGenes() 
     { 
      for (int i = 0; i < SIZE; ++i) 
      { 
       for (int j = 0; j < SIZE; j++) 
       { 
        this.setGene(i, j, rand2.Next(1)); 
       } 
      } 
     } 

Ich brauche nur einen Satz von 25 radnom 1 und 0 für jeder der 10 Personen. Aber ich bekomme immer das gleiche Set für jede der 10 Personen, wenn ich noch mehr damit spiele, bekomme ich nur 0s. Es ist nur, wenn ich den Debug-Modus betrete, dass ich wirklich zufällige Zahlen bekomme. Ich sehe überall, dass das neue zufällige außerhalb der Methode und/oder der Schleife erstellt werden sollte, was ich tat, weiß ich nicht, was als nächstes zu tun?

BEARBEITEN Meine Frage war kein Duplikat dieser Frage, weil die dort angegebene Antwort mir nicht geholfen hat. Was mir jedoch geholfen hat, war die Antwort, die ich unten vergeben habe.

Antwort

1

Weil Sie effektiv eine neue Instanz von Random in so kurzer Zeit erstellen, kann Random nicht einen anderen Seed verwenden - der auf der aktuellen Zeit basiert (ganz explizit, wie in Ihrem Beispiel)). Der Grund, warum es im Debug-Modus funktioniert, ist, dass der Overhead des Debuggers den Code langsamer laufen lässt, was bedeutet, dass zwischen dem Erstellen von zufälligen Instanzen Zeit verstrichen ist, was bedeutet, dass er mit einem anderen Wert beginnen kann. (ZB erzeugt derselbe Samen immer den gleichen Satz von Zufallszahlen). Sie sollten eine statische Variable erstellen, um eine Instanz von Random zu speichern, und überall in Ihrem Programm dieselbe zufällige Instanz verwenden. Sie sollten

static Random rand2 = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);

auf Ihre zufällige Änderungen der Lage sein, und es sollte zu arbeiten beginnen.

+0

Das löste es, ich habe versucht, statische Random verwenden, aber ich habe nicht die Datetime als Seed verwendet ... – Vrankela

+0

Sie sollten wahrscheinlich die DateTime Seed komplett weglassen, da dies das Standardverhalten ist sowieso. Gut zu hören, dass es jetzt sowieso für dich funktioniert :) – Warrick

1

rand2 scheint eine Instanzvariable zu sein, daher erstellen Sie einen neuen Zufallszahlengenerator für jedes Objekt. Da Ticks eine Zahl in Millisekunden ist, wenn der Code schnell genug ausgeführt wird, ist der Seed für alle Individual gleich, und alle Zufallszahlengeneratoren geben die gleiche Sequenz zurück.

Dies passiert nicht, wenn Sie in den Debugger einbrechen, weil Sie eine künstliche Verzögerung einführen.

Verwenden Sie entweder das gleiche Random Objekt für jeden Individual, oder setzen Sie den RNG anders.

Verwandte Themen