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