.NET随机数生成器 - 自动种子

时间:2011-11-18 11:21:16

标签: c# .net random

我在我的应用程序中使用随机数生成器。但是,有时它会返回完全相同的值。我的研究表明,默认的Random构造函数将系统时间作为种子。当使用相同的种子时,生成相同的数字。因此,如果在相同的系统时间内完成我的方法的调用(例如,在调用之间具有非常小的延迟),则生成相同的数字。

所以看起来不错的解决方案是稍微延迟通话,因此需要独特的时间。我的问题是 - 什么是.NET种子生成器中的原子时间单位 - 我可以用来等待的最小数字,以便识别唯一时间并生成唯一种子?

另外,是否正确延迟线程睡眠?

例如

int smallestTimeUnit = 20;
Thread.Sleep(smallestTimeUnit);

或者系统时间种子生成不可靠,我应该实现自己的种子生成方式吗?

谢谢。

3 个答案:

答案 0 :(得分:10)

解决方案是重用相同的Random对象,而不是每次都创建一个新对象。

答案 1 :(得分:1)

正如已经回答的那样,创建一个Random的单个实例可能是最好的方法。

但是当你想要单独的实例时,你可以轻松确保种子不同:

static int baseSeed = 0;

var r = new Random(baseSeed++); // not thread-safe

种子需要不同但不一定是随机的。如果你不喜欢使用1,2,3,..种子,那么使用一个单独的静态随机实例来生成种子。

当你从多个线程中使用它时,使用Interlocked.Increment()来更改baseSeed,或者使用lock()静态Random。

答案 2 :(得分:0)

如果你多次调用一个方法中的随机数,你需要传递一个Random对象作为参数;像这样的东西:

var random = new Random();
for (var i=0; i<=1000; i++)
{
    ....
    foo(par, random);
    ....
}

void foo(string somePar, Random rnd)
{
    var val = rnd.next();
}