关于c#:随机数生成 – 返回相同的数字

Random Number Generation - Same Number returned

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
c# - getting the same random number repeatedly
Random number generator not working the way I had planned (C#)

我有一个方法可以构建一个整数队列:

1
2
3
4
5
6
7
8
9
10
11
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 ound.rint()只是一个委托给随机类函数的函数:

1
2
3
4
5
6
7
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;
    }

但是当我调用generateTrainits时,每次都会有相同的数字排队。但是,如果我将rint更改为使用随机类的静态实例,而不是本地实例(上面定义了函数作用域),那么它看起来工作正常(将随机整数排队)。有人知道为什么会这样吗?

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


你需要保持同一个Random对象。将它作为静态成员放到静态方法之外

1
2
3
4
5
6
7
private static Random rand = new Random();

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

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


尝试以下代码,我想您会明白原因:

1
2
3
4
5
6
7
void PrintNowAHundredTimes()
{
    for (int i = 0; i < 100; ++i)
    {
        Console.WriteLine(DateTime.Now);
    }
}

Random对象不断地获得相同的种子。这是因为DateTime.Now返回的系统时间粒度非常简单,是有限的。例如,在我的机器上,该值每15毫秒才更改一次。因此在该时间段内连续调用返回的时间相同。

正如我猜想的那样,两个初始化为相同种子值的Random对象将生成相同的随机序列。(从技术上讲,这就是它被称为伪随机的原因。)

您还应该知道,即使在方法中本地实例化一个新的Random对象是有意义的,但将其设置为null仍然没有任何作用(一旦该方法退出,就不会再有对该对象的引用,因此不管怎样,它都将被垃圾收集)


1
2
3
4
5
6
7
8
9
10
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;
    }
}