当我在C#中的循环内声明Random时,它会给我非随机数——在循环外声明它会给我们随机数.为什么?

本文关键字:声明 随机数 循环 非随机 我们 为什么 Random | 更新日期: 2023-09-27 18:27:31

我正在创建一副牌。当我尝试洗牌时,我会感到有些奇怪。

在调用我的程序之前,构造函数要经过以下循环(包括伪代码)-

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;
}

这给了我半可预测的输出,即以下内容:

18181817171716161515151414141313131212121111111010109998.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,17,27,0,11,2,14,9,0,8,10,17,4,1,0,0,2,1,0,0

当我从VisualStudio发布代码并运行输出的程序时,这种差异似乎消失了。我很困惑到底发生了什么。既然我有4个核心,这是不是在同一毫秒将进程分配到4个核心上,从而使用与其种子相同的数字?不过,当我发布代码时,为什么它能工作,这是没有意义的。。。

当我在C#中的循环内声明Random时,它会给我非随机数——在循环外声明它会给我们随机数.为什么?

随机数的生成从种子值开始。如果相同重复使用种子,生成相同的数字序列。一产生不同序列的方法是使种子值与时间相关,从而产生不同的系列Random的实例。默认情况下随机类使用系统时钟生成其种子值

通过在循环中包含声明,可以有效地一次又一次地调用具有相同值的构造函数,因此可以得到相同的数字。

随机类