我在我的应用程序中使用随机数生成器。但是,有时它会返回完全相同的值。我的研究表明,默认的Random构造函数将系统时间作为种子。当使用相同的种子时,生成相同的数字。因此,如果在相同的系统时间内完成我的方法的调用(例如,在调用之间具有非常小的延迟),则生成相同的数字。
所以看起来不错的解决方案是稍微延迟通话,因此需要独特的时间。我的问题是 - 什么是.NET种子生成器中的原子时间单位 - 我可以用来等待的最小数字,以便识别唯一时间并生成唯一种子?
另外,是否正确延迟线程睡眠?
例如
int smallestTimeUnit = 20;
Thread.Sleep(smallestTimeUnit);
或者系统时间种子生成不可靠,我应该实现自己的种子生成方式吗?
谢谢。
答案 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();
}