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

可能重复:
c# – 重复获取相同的随机数
随机数发生器不按我计划的方式工作(C#)

我有一个方法,build立一个整数的队列:

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类的静态实例,而不是本地实例(具有上面定义的函数范围),那么它似乎能正常工作(排队随机整数)。 有人知道为什么会发生这种情况吗?

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

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

试试下面的代码,我想你会看到为什么:

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

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

正如我怀疑你已经知道,用相同的种子值初始化的两个Random对象将生成相同的随机序列。 (这就是为什么在技术上叫做伪随机的原因。)

你也应该知道,即使在你的方法中本地实例化一个新的Random对象是有意义的,将它设置为null仍然没有任何用处(一旦方法退出,将不再有对该对象的引用,所以它将无论收集垃圾)。

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