我有一段简单的代码:
public string GenerateRandomString()
{
string randomString = string.Empty;
Random r = new Random();
for (int i = 0; i < length; i++)
randomString += chars[r.Next(chars.Length)];
return randomString;
}
如果我调用此函数生成两个字符串,一个接一个,它们是相同的...但如果我通过生成字符串的两行调试 - 结果是不同的。 有谁知道为什么会这样?
答案 0 :(得分:6)
这种情况正在发生,因为调用彼此非常接近(在相同的毫秒期间),然后Random构造函数将使用相同的值为Random对象播种(它默认使用日期和时间)。 / p>
所以,实际上有两种解决方案。
<强> 1。提供您自己的种子值,每次构造Random对象时都是唯一的。
<强> 2。始终使用相同的随机对象 - 仅构造一次。
就个人而言,我会使用第二种方法。它可以通过使Random对象静态或使其成为类的成员来完成。
答案 1 :(得分:5)
以上答案是正确的。我建议您对代码进行以下更改:
1)我建议使用StringBuilder而不是一直追加到字符串。字符串是不可变的,因此每次添加时都会创建一个新字符串。如果您从未使用过StringBuilder,请查阅它。这对这类工作非常有用。
2)如果将长度传递给方法本身,可以使方法更容易重用。你也许可以传递chars数组,但我已经把它留了出来。
3)每次使用相同的随机对象,如上所述。
public string GenerateRandomString(int length)
{
StringBuilder randomString = new StringBuilder(length);
for (int i = 0; i < length; i++)
randomString.Append(chars[(int)(_RandomObj.Next(chars.Length))].ToString());
return randomString.ToString();
}
答案 2 :(得分:2)
这是因为你正在同时创建两个随机对象。这给了它相同的种子,所以你将获得相同的数字。
当你调试它时,在创建随机对象之间有时间可以让它们得到不同的种子。
答案 3 :(得分:1)
Random的默认构造函数(您正在使用的构造函数)使用基于当前时间的值为发生器播种。如果以毫秒为单位的时间在函数的第一次和第二次调用之间没有变化,那么它将使用相同的随机种子。
我的建议是使用静态Random对象,只初始化一次。
答案 4 :(得分:1)
由于Random
生成器与系统时钟绑定,因此您可能会在该时间段内显示相同的结果。有几种方法可以纠正。如果您正在使用循环,请将Random rnd = new Random();
置于循环之外。
将Random rnd = new Random();
行放在声明变量的位置,并在整个程序中使用相同的变量(本例中为rnd)。
这在大多数情况下都有效。