Random() 为每个调用生成相同的结果

本文关键字:结果 调用 Random | 更新日期: 2023-09-27 18:23:54

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 方法就不会再次运行了吗?

Random() 为每个调用生成相同的结果

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

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

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

如果无法使 Random 对象在调用之间持续存在,则需要在每次调用该对象时为其设定伪随机值。

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

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

巧合?

我不这么认为。

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