2015-12-05 125 views
-1

一個函數將24個隨機字符串從具有for循環的數組輸入到字符串列表中。另一個函數顯示控制檯中列表中的字符串。然而,我只能得到一個值,例如111111111111111111111111111。當我設置斷點時,我得到了我正在尋找的輸出,如12kingace342356110。這是我的函數類代碼。C#輸出與斷點輸出不同

namespace CardWarConsoleGame 
{ 
    class Deck 
    { 
     public string[] CardNames = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace" }; 
     public int[] CardValues = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }; 
    } 


    class WarFunctions 
    { 
     public static List<string> YourDeck = new List<string>(); 
     public static List<string> AIDeck = new List<string>(); 

     public static void LoadCards() 
     { 
      Deck deck = new Deck(); 
      for (int i = 0; i < 24; i++) 
      { 
       Random r = new Random(); 
       YourDeck.Add(deck.CardNames[r.Next(0, 14)]); 
      } 

     } 

     public static void test() 
     { 
      for (int i = 0; i < YourDeck.Count; i++) 
      { 
       Console.Write(YourDeck[i]); 
      } 
     } 
    } 
} 



Heres the program.cs 

namespace CardWarConsoleGame 
{ 
    class Program : WarFunctions 
    { 
     static void Main(string[] args) 
     { 
      LoadCards(); 
      test(); 
      Console.ReadLine(); 
     } 
    } 
} 

回答

4

您應該在循環之前創建Random

public static void LoadCards() 
{ 
    Deck deck = new Deck(); 
    Random r = new Random(); 
    for (int i = 0; i < 24; i++) 
    { 
     YourDeck.Add(deck.CardNames[r.Next(0, 14)]); 
    } 
} 

Randomdefault constructor

初始化隨機類的新實例,使用一個依賴於時間的默認種子值。

默認種子值是從系統時鐘派生的,並具有有限的分辨率。因此,通過對默認構造函數的調用而緊密連續創建的不同Random對象將具有相同的默認種子值,因此將生成相同的隨機數集合。

1
public static void LoadCards() 
{ 
    Deck deck = new Deck(); 
    for (int i = 0; i < 24; i++) 
    { 
     Random r = new Random(); 
     YourDeck.Add(deck.CardNames[r.Next(0, 14)]); 
    } 
    } 

你的Random類不應該在foreach循環中被創建。如果您在foreach循環中隨機生成隨機數字,則隨機生成隨機數,然後根據系統時鐘的時間繼續啓動該序列。如果你把它放在foreach循環之外,它會保持它的初始種子數據併產生數字而不會重新回到第一個數據。

所以,你的代碼應該是這樣的:

public static void LoadCards() 
{ 
    //Random initialized outside of the foreach loop 
    Random r = new Random(); 
    Deck deck = new Deck(); 
    for (int i = 0; i < 24; i++) 
    { 
     YourDeck.Add(deck.CardNames[r.Next(0, 14)]); 
    } 
    } 

文檔上default constructor隨機。

1

Check this link. They describe it beautifully 問題是您正在創建Random類的實例時間太近。

當您創建一個Random對象時,它將使用來自系統時鐘的值進行播種。如果你創建的Random實例時間太近,它們將全部以相同的隨機序列播種。

創建單個Random對象,並在創建「a」類的實例時將其引用傳遞給構造函數,而不是爲每個「a」實例創建一個Random對象。