我正在制作一副纸牌。当我试图洗牌时,我会变得有点古怪。
调用程序之前的构造函数将执行以下循环(伪代码,包括) -
for i in (0,13):
for j in (0,3):
new Card(i,j)
无论如何,这是简化形式。基本上生成带有数字和套装的卡片。现在问题代码(C#):
private void Shuffle()
{
List<Card> newList = new List<Card>();
while (cards.Count > 0)
{
Random r = new Random();
int next = r.Next(0,cards.Count);
Console.WriteLine(next);
Card cur = cards.ElementAt(next);
newList.Add(cur);
cards.Remove(cur);
}
this.cards = newList;
}
这给了我半可预测的输出 - 即以下内容:
18 18 18 17 17 17 16 16 15 15 15 14 14 14 13 13 13 12 12 12 11 11 11 10 10 10 9 9 9 8 8 8 7 7 7 6 6 6 五 五 五 4 4 3 3 3 1 五 4 3 2 2 1 0
接近尾声似乎打破了模式,但我不确定为什么。再次运行它会给我不同但非随机的输出。
但是,如果我将随机声明移除到OUTSIDE循环 -
private void Shuffle()
{
List<Card> newList = new List<Card>();
Random r = new Random(); /** THE ONLY DIFFERENT LINE **/
while (cards.Count > 0)
{
int next = r.Next(0,cards.Count);
Console.WriteLine(next);
Card cur = cards.ElementAt(next);
newList.Add(cur);
cards.Remove(cur);
}
this.cards = newList;
}
在这种情况下,我得到更多随机的看似数字 -
19,28,21,2,16,20,33,26,7,36,31,33,33,26,34,4,18,20,13,27,16,11,18,22 ,18,21,21,8,22,12,6,17,2,17,0,11,2,14,9,0,8,10,1,7,4,1,0,0,2 ,1,0,0
当我从Visual Studio发布代码并运行输出的程序时,这种差异似乎消失了。我对发生了什么很困惑。由于我有4个内核,这是否在同一毫秒内将进程分配到4个内核,从而使用与其种子相同的数字?当我发布代码时,为什么它正在工作,这是没有意义的......
答案 0 :(得分:4)
随机数生成从种子值开始。如果相同 种子被重复使用,生成相同的数字序列。一 产生不同序列的方法是制作种子价值 与时间有关,从而与每个新系列产生不同的系列 随机的实例。默认情况下,无参数构造函数 Random类使用系统时钟生成其种子值
通过在循环中声明你有效地一遍又一遍地调用具有相同值的构造函数 - 因此你得到相同的数字。