在静态方法中生成随机值似乎缓存

时间:2014-07-15 08:55:52

标签: c#

我在静态类中有一个静态方法,它可以生成随机字符串,如下所示:

public static class DataGenerator
    {
        public static string GenerateRandomString(int length)
        {
            const string Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            var random = new Random();
            return new string(
                Enumerable.Repeat(Chars, length)
                    .Select(s => s[random.Next(s.Length)])
                    .ToArray());
        }
}

当我从同一个调用函数多次调用此方法时,它似乎缓存生成的字符串。

以下是一个使用示例:

var item = new CodeDescActivePo()
                {
                    Active = true, 
                    Code = DataGenerator.GenerateRandomString(10), 
                    Description = DataGenerator.GenerateRandomString(10)
                };

请注意,有两次调用GenerateRandomString,我希望有2个唯一的随机数,在这种情况下,Code和Description总是相同的。

为什么GenerateRandomString每次都不会生成新的随机数?

3 个答案:

答案 0 :(得分:9)

您正在快速呼叫var random = new Random();。由于默认种子是基于时间的,因此种子是相同的。最好每次需要时创建一次变量Random.Next()

public static class DataGenerator
{
    private readonly static Random random = new Random();

    public static string GenerateRandomString(int length)
    {
       //etc etc using random.Next()
    }
}

答案 1 :(得分:1)

因为您正在为每个呼叫使用new Random()个实例。默认情况下,它使用当前系统时间播种,这意味着同时创建的多个Random实例将提供相同的值。

Random实例设为static字段,以使其在调用之间保持活动状态。

答案 2 :(得分:0)

<强>问题:

来自MSDN

  

默认种子值源自系统时钟并具有有限的分辨率。因此,通过调用默认构造函数紧密连续创建的不同Random对象将具有相同的默认种子值,因此将生成相同的随机数集。

解决方案:再次来自MSDN

  

使用单个Random对象生成所有随机数可以避免此问题。您还可以通过修改系统时钟返回的种子值,然后将此新种子值显式提供给Random(Int32)构造函数来解决此问题。有关更多信息,请参阅Random(Int32)构造函数。