【发布时间】:2011-06-18 20:26:03
【问题描述】:
可能的重复:
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 类的静态实例,而不是本地实例(具有上面定义的函数范围),那么它似乎可以正常工作(将随机整数排入队列)。有人知道为什么会这样吗?
编辑: 亲爱的回答者没有仔细阅读我的问题, 就像你们中的一些人指出的那样,我正在寻找一个很好的解释来解释为什么会发生这种情况。我不是在寻找相同数字生成问题的解决方案,因为我已经像上面所说的那样解决了这个问题。不过感谢您的热情 :) 我真的只是想了解这样的事情,因为我的第一个实现在概念上对我来说更有意义。
【问题讨论】:
-
似乎是重复的...查看相关问题,例如 -stackoverflow.com/questions/1437825/…
-
这是因为
Random对象是从Environment.GetTickCount初始化的,这是一个毫秒计时器。因此,如果您在同一毫秒内调用Random构造函数两次,您将获得相同的初始值。 -
当 rand 用相同的种子实例化(例如 DateTime.Now.Millisecond 在你的情况下),它将返回相同的值序列。您应该将其实例化一次(并将其存储在静态变量中),或者每次使用不同的种子。
-
关于您的编辑:我认为这让许多开发人员感到厌烦的原因是名称本身,
Random。他们认为它是“一个随机数”。它真的应该被称为RandomSequence或类似的东西。那么就更明显的是没有必要继续实例化新的了。 -
@Dan Tao 这是一个很好的观点。虽然我一直都知道随机意味着伪随机,但在实践中从来没有分离过这些概念,即使用随机数生成器总是被视为真正随机的,即使它不是因为实现对开发人员隐藏...跨度>