4

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

干杯

4

4 回答 4

3

种子以毫秒为单位,范围为 10 毫秒到 16 毫秒。但要记住的最重要的事情是,您应该始终使用相同的实例Random生成 不同的“随机”值。如果您总是在一个紧密的循环中创建一个新实例,那么您会多次获得相同的值。

因此,如果您仍然使用相同的实例,则使用默认构造函数是“安全的”。如果不是因为你在不同的线程中需要它们,你可以使用 Jon Skeet 的这个帮助类(来自这里):

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;
        }
    }
}
于 2012-11-06T14:01:41.097 回答
3

它使用Environment.TickCount你可以在反射器中检查它。但关键是要获得一个唯一的种子,因此您可以使用 ProcessID 对该值进行算术运算。像:

Random(Environment.TickCount + System.Diagnostics.Process.GetCurrentProcess().Id);

等等

于 2012-11-06T14:16:52.863 回答
2

如果您使用不同的进程,请考虑使用进程 ID 为每个进程创建 Random 的单个实例。

private static readonly Random _theSingleRandom = 
                          new Random(Process.GetCurrentProcess().Id);
于 2012-11-06T14:07:21.097 回答
0

System.Random 使用 TickCount 作为其种子。http://msdn.microsoft.com/en-us/library/windows/desktop/ms724408(v=vs.85).aspx上的 MSDN 文档指出,

分辨率 [...] 受限于系统计时器的分辨率,通常在 10 毫秒到 16 毫秒的范围内。

所以在 2 个不同的 TickCount 值之间有 10 到 16 毫秒。

于 2012-11-06T13:59:57.940 回答