Random()为每次调用产生相同的结果

时间:2013-07-18 20:15:21

标签: c# asp.net

public string Weird
{
    get
    {
        int length = 10;
        Random random = new Random();
        string chars = "123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXZ";
        StringBuilder builder = new StringBuilder(length);

        for (int i = 0; i < length; i++)
        {
            builder.Append(chars[random.Next(chars.Length)]);
        }

        return builder.ToString();
    }
}

Response.Write(Weird);
Response.Write("<br />");
Response.Write(Weird);
Response.Write("<br />");
Response.Write(Weird);

Result : 

9eFZ5XrJxZ
9eFZ5XrJxZ
9eFZ5XrJxZ

我认为每次调用的结果都不同,但它会返回相同的结果值。 它怎么可能? 一旦分配了变量,那么get方法将不会再次运行?

3 个答案:

答案 0 :(得分:4)

来自http://msdn.microsoft.com/en-us/library/system.random.aspx

  

随机数生成从种子值开始。如果重复使用相同的种子,则生成相同的数字序列。产生不同序列的一种方法是使种子值与时间相关,从而与每个新的Random实例产生不同的序列。

     

默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值,而其参数化构造函数可以根据当前时间中的滴答数采用Int32值。但是,由于时钟具有有限的分辨率,因此使用无参数构造函数以紧密连续的方式创建不同的随机对象会创建随机数生成器,从而生成相同的随机数序列。

答案 1 :(得分:0)

如果无法使Random对象在调用之间保持不变,则每次调用时都需要使用伪随机值对其进行种子设定。

答案 2 :(得分:-2)

Dilbert在2001年遇到了同样的问题:

http://dilbert.com/strips/comic/2001-10-25/

重合?

我不这么认为。

且random.org同意: http://www.random.org/analysis/