当我宣布我随机在C#循环中,它给了我非随机的号码 - 它声明我的外循环让我随机数。 为什么?

2019-10-18 12:17发布

这个问题已经在这里有一个答案:

  • 随机数发生器只有生成一个随机数 9回答

我创建的一副牌。 当我尝试重新洗牌,我得到了一些怪事。

打电话给我的程序前的构造经过下面的循环(伪代码,含) -

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 5 5 5 4 4 3 3 3 1 5 4 3 2 2 1 0

临近年底,似乎打破格局,但我不知道为什么。 再次运行它给了我不同,但非随机的输出。

但是,如果我删除随机申报外循环 -

    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个核在相同毫秒,从而使用相同数量作为它的种子? 这是没有意义的,为什么它的工作,当我发布的代码,虽然...

Answer 1:

随机数生成从种子值开始。 如果相同的种子被反复使用,会产生相同的一系列数字。 以产生不同的序列的一种方法是使种子值随时间变化的,从而产生不同系列的具有随机的每个新实例。 默认情况下,Random类的参数的构造函数使用系统时钟产生的种子值,

通过在循环中的声明,您可以有效地调用具有相同值的构造一遍又一遍 - 因此你所得到的相同号码的开出。

Random类



文章来源: When I declare Random inside my loop in C#, it gives me nonrandom numbers - declaring it outside my loop gives me random numbers. Why? [duplicate]