我有几个进程,我使用System.Random的默认构造函数生成随机数。 我在MSDN上读过它,但它没有说它使用的具体系统时钟分辨率,例如System.Random是以ms还是秒获得系统时钟种子?在多个进程中使用默认构造函数来获取它们之间的随机值是否安全?
干杯
答案 0 :(得分:3)
种子以毫秒为单位,范围为10毫秒至16毫秒。但要记住的最重要的事情是,如果可以生成不同的“随机”值,则应始终使用Random
的相同实例。如果您总是在紧密循环中创建一个新实例,那么很多次都会获得相同的值。
因此,如果您使用相同的实例,则使用默认构造函数是“安全的”。如果不是因为你需要它们在不同的线程中,你可以使用Jon Skeet的这个助手类(来自here):
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;
}
}
}
答案 1 :(得分:3)
它使用Environment.TickCount
你可以在Reflector中检查它。
但关键是获取一个唯一的种子,因此您可以对ProcessID使用此值的算术运算。像:
Random(Environment.TickCount + System.Diagnostics.Process.GetCurrentProcess().Id);
等
答案 2 :(得分:2)
如果您使用的是不同的流程,请考虑使用流程ID为每个流程创建一个Random的单个实例。
private static readonly Random _theSingleRandom =
new Random(Process.GetCurrentProcess().Id);
答案 3 :(得分:0)
System.Random使用TickCount作为其种子。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms724408(v=vs.85).aspx个州的MSDN文档,
分辨率[...]仅限于系统计时器的分辨率, 通常在10毫秒到16毫秒的范围内。
因此,两个不同的TickCount值之间有10到16毫秒。