一尘不染

随机数生成-返回相同的数字[重复]

c#

这个问题已经在这里有了答案

9年前关闭。

可能的重复项:
c#- 重复
获取相同的随机数

随机数生成器未按我计划的方式工作(C#)

我有一个方法来建立一个整数队列:

public Queue<int> generateTrainingInts(int count = 60)
    {
        Queue<int> retval = new Queue<int>();

        for (int i = 0; i < count; i++)
        {
            retval.Enqueue(JE_Rand.rInt(2001, 100));
        }

        return retval;
    }

JE_Rand.rInt()只是一个委派给Random类的函数的函数:

public static int rInt(int exclUB, int incLB = 0)
    {
        Random rand = new Random(DateTime.Now.Millisecond);
        int t = rand.Next(incLB, exclUB);
        rand = null;            
        return t;
    }

但是,当我调用generateTrainingInts时,每次都会排队相同的数字。但是,如果将rInt更改为使用Random类的静态实例,而不是使用本地实例(具有上面定义的函数作用域),则它似乎可以正常工作(排队随机整数)。有人知道为什么会这样吗?

编辑:亲爱的回答者们,他们没有彻底阅读我的问题,就像你们中的一些人指出的那样,我正在寻找一个很好的解释为什么会这样。我不是要寻找相同数字生成问题的解决方案,因为我已经像上面所说的那样解决了这个问题。不过感谢您的热情:)我真的只想了解这样的事情,因为从概念上来说我的第一个实现更有意义。


阅读 409

收藏
2020-05-19

共1个答案

一尘不染

您需要保留相同的Random对象。将其作为静态成员放在静态方法之外

private static Random rand = new Random();

public static int rInt(int exclUB, int incLB = 0)
{
    int t = rand.Next(incLB, exclUB);
    return t;
}

编辑
原因是用于初始化的时钟的有限分辨率Random。随后的Random初始化将在随机序列中获得相同的起始位置。当重复使用相同的Random时,总是会生成随机序列中的下一个值。

2020-05-19