2015-12-05 83 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对象。