可能重复:
c# - 重复获取相同的随机数
随机数生成器不按照我计划的方式工作(C#)
我有一个构建int队列的方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
但是当我调用generateTrainingInts时,每次都会将相同的数字排入队列.但是,如果我更改rInt以使用Random类的静态实例,而不是本地实例(具有上面定义的函数作用域),那么它似乎正常工作(排队随机整数).有人知道为什么会这样吗?
编辑:亲爱的答案者没有彻底阅读我的问题,就像你们中的一些人指出的那样,我正在寻找一个很好的解释为什么会发生这种情况.我不是在寻找同一数字生成问题的解决方案,因为我已经解决了,就像我上面所说的那样.感谢你的热情:)我真的只想了解这样的事情,因为我的第一次实现对我来说在概念上更有意义.
Alb*_*nbo 25
你需要保持相同的Random对象.将它作为静态成员放在静态方法之外
private static Random rand = new Random();
public static int rInt(int exclUB, int incLB = 0)
{
int t = rand.Next(incLB, exclUB);
return t;
}
Run Code Online (Sandbox Code Playgroud)
编辑
原因是用于初始化的时钟的有限分辨率Random.Random的后续初始化将在随机序列中获得相同的起始位置.当重用相同的Random时,总是生成随机序列中的下一个值.
试试下面的代码,我想你会明白为什么:
void PrintNowAHundredTimes()
{
for (int i = 0; i < 100; ++i)
{
Console.WriteLine(DateTime.Now);
}
}
Run Code Online (Sandbox Code Playgroud)
该Random对象被一遍又一遍地得到相同的种子.这是因为返回的系统时间的粒度DateTime.Now非常简单,是有限的.例如,在我的机器上,值每隔约15毫秒就会改变一次.因此,该时间段内的连续呼叫返回相同的时间.
正如我怀疑您已经知道的那样,Random使用相同种子值初始化的两个对象将生成相同的随机序列.(这就是为什么它在技术上被称为伪随机.)
您还应该意识到,即使Random在您的方法中本地实例化一个新对象是有意义的,将其设置为null仍然没有用处(一旦该方法退出,无论如何将不再有对该对象的引用,所以它将是垃圾无论如何收集).
| 归档时间: |
|
| 查看次数: |
27101 次 |
| 最近记录: |