System.Random默认构造函数系统时钟分辨率?

时间:2012-11-06 13:53:58

标签: c# .net random

我有几个进程,我使用System.Random的默认构造函数生成随机数。 我在MSDN上读过它,但它没有说它使用的具体系统时钟分辨率,例如System.Random是以ms还是秒获得系统时钟种子?在多个进程中使用默认构造函数来获取它们之间的随机值是否安全?

干杯

4 个答案:

答案 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毫秒。