2016-07-17 6 views
-1

Ich versuche, diesen Code zu bekommen, um 4 Schlüssel nach dem Zufallsprinzip auszuwählen, und schreibe sie dann mit einer 'foreach'-Schleife in die Konsole. Anstatt für jede Iteration eine zufällige Auswahl auszuwählen, wählt sie nur zufällig einen der Schlüssel aus und schreibt ihn viermal auf die Konsole. Hier ist der Code:Warum wird diese Methode nur einmal randomisiert, anstatt jede Iteration zufällig zu setzen?

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 

namespace ListPractice 
{ 
    public class DictionaryData 
    {   
     public static void GetRandomKey() 
     { 
      Dictionary<string, int[]> QandA_Dictionary = new Dictionary<string, int[]>(); 
      QandA_Dictionary.Add("What is 1 + 1?", new int[] { 1, 2, 3, 4 }); 
      QandA_Dictionary.Add("What is 1 + 2?", new int[] { 1, 2, 3, 4 }); 
      QandA_Dictionary.Add("What is 1 + 3?", new int[] { 1, 2, 3, 4 }); 
      QandA_Dictionary.Add("What is 1 + 4?", new int[] { 2, 3, 4, 5 }); 

      List<string> keys = new List<string>(QandA_Dictionary.Keys); 

      foreach (var element in keys) 
      { 
       Random rand = new Random(); 
       string randomKey = keys[rand.Next(keys.Count)]; 
       Console.WriteLine(randomKey); 
      } 
      Console.ReadKey(); 
     } 

     public static void Main(string[] args) 
     { 
      GetRandomKey(); 
     } 

    } 
} 

Antwort

1

Es randomisiert einmal, weil Sie eine neue Instanz der Random Klasse halten zu schaffen. Jedes Mal, wenn Sie eine Instanz der Random-Klasse ohne Startwert initialisieren, wird automatisch die aktuelle Tickzahl der Uhr als Startwert verwendet. Aufgrund der Geschwindigkeit, mit der eine Schleife normalerweise iteriert, wird sie in ein paar Millisekunden ausgeführt, was bedeutet, dass Ihre Random ziemlich immer den gleichen Seed hat.

Deklarieren der Randomaußerhalb Ihre Schleife in einer Saatgutwechsel jedes Mal, führen Sie es verwenden, damit Sie nicht die gleiche Nummer (n) über bekommen und immer wieder:

Random rand = new Random(); 
foreach (var element in keys) 
{ 
    string randomKey = keys[rand.Next(keys.Count)]; 
    Console.WriteLine(randomKey); 
} 
+0

Das ist ziemlich interessant. Ich lerne noch. Danke für Ihre Hilfe. – sean

+0

@sean: Kein Problem, ich bin froh, dass ich dir helfen konnte! Es gibt noch mehr Informationen zu lesen [** die MSDN-Dokumentation darüber **] (https://msdn.microsoft.com/en-us/library/h343ddh9 (v = vs.110) .aspx). –