一个函数将24个随机字符串输入到带有for循环的数组的字符串列表中。另一个函数显示控制台列表中的字符串。但是我只得到一个值循环,例如1111111111111111111111111.当我设置断点时,我得到我正在寻找的输出,如12kingace342356110。这是我的函数类代码。
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();
}
}
}
答案 0 :(得分:4)
您应该在循环之前创建birthDate
。
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)]);
}
}
使用与时间相关的默认种子值初始化Random类的新实例。
默认种子值源自系统时钟并具有有限的分辨率。因此,通过调用默认构造函数紧密连续创建的不同Random对象将具有相同的默认种子值,因此将生成相同的随机数集。
答案 1 :(得分: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)]);
}
}
不应在foreach循环中创建Random类。如果你在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的文档。
答案 2 :(得分:1)
Check this link. They describe it beautifully 问题是你正在及时创建Random类的实例。
创建Random对象时,会使用系统时钟中的值播种。如果你在时间上创建的Random实例太接近了,它们都将以相同的随机序列播种。
创建单个Random对象,并在创建“a”类的实例时将其引用传递给构造函数,而不是为每个“a”实例创建一个Random对象。