我有几个进程,其中使用 System.Random 的默认构造函数生成随机数。
我在 MSDN 上阅读了相关信息,但它并没有说明具体的系统时钟分辨率,例如 System.Random 是否以毫秒或秒为单位获取系统时钟种子?在多个进程中使用默认构造函数获取随机值是否安全?
谢谢。
谢谢。
Random
实例。如果您总是在紧密循环中创建新实例,则会多次获得相同的值。public static class RandomHelper
{
private static int seedCounter = new Random().Next();
[ThreadStatic]
private static Random rng;
public static Random Instance
{
get
{
if (rng == null)
{
int seed = Interlocked.Increment(ref seedCounter);
rng = new Random(seed);
}
return rng;
}
}
}
[ThreadStatic]
),这是必需的,因为System.Random
不是线程安全的。 - CodesInChaos它使用Environment.TickCount
,您可以在反编译器中查看它。
但重点是获得一个唯一的种子,因此您可以对此值进行算术运算,并使用ProcessID。例如:
Random(Environment.TickCount + System.Diagnostics.Process.GetCurrentProcess().Id);
etc.
如果您正在使用不同的进程,请考虑使用进程ID为每个进程创建单个Random实例。
private static readonly Random _theSingleRandom =
new Random(Process.GetCurrentProcess().Id);
System.Random使用TickCount作为其种子。MSDN文档http://msdn.microsoft.com/en-us/library/windows/desktop/ms724408(v=vs.85).aspx指出:
分辨率[...]受系统计时器的分辨率限制,通常在10毫秒到16毫秒之间。
因此,在两个不同的TickCount值之间有10到16毫秒的时间差。