随机数生成 - 返回相同的数字

时间:2011-01-31 20:32:36

标签: c# random

  

可能重复:
  c# - getting the same random number repeatedly
  Random number generator not working the way I had planned (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类的静态实例,而不是本地实例(具有上面定义的函数作用域),那么它似乎正常工作(排队随机整数)。有人知道为什么会这样吗?

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

3 个答案:

答案 0 :(得分:24)

您需要保留相同的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时,总是生成随机序列中的下一个值。

答案 1 :(得分:5)

尝试以下代码,我想你会明白为什么:

void PrintNowAHundredTimes()
{
    for (int i = 0; i < 100; ++i)
    {
        Console.WriteLine(DateTime.Now);
    }
}

Random个对象一遍又一遍地获得相同的种子。这是因为DateTime.Now返回的系统时间的粒度非常简单,是有限的。例如,在我的机器上,值每隔约15毫秒就会改变一次。因此,在该时间段内的连续呼叫返回相同的时间。

正如我怀疑您已经知道的那样,使用相同种子值初始化的两个Random对象将生成相同的随机序列。 (这就是为什么它在技术上被称为伪随机。)

您还应该意识到即使在您的方法中在本地实例化新的Random对象是有意义的,将其设置为null仍然没有用处(一旦方法退出,将会有无论如何不再引用该对象,因此无论如何都会被垃圾收集。

答案 2 :(得分:1)

public class JE_Rand
{
   private static Random rand= new Random(DateTime.Now.Millisecond);

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