为什么这个方法每次都返回相同的随机字符串?

我需要创建一个独特的块来测试我正在处理的不同项目。

所以我创建了一个简单的程序来生成一个X长度的随机字符串。

问题是如果我调用它一次,我得到一个随机字符串,如果我再次调用它(例如在for循环中)我得到相同的字符串用于循环的整个执行。

我有一种感觉,它被缓存或其他东西,但我不知道.net这样做,我只是在这一点上感到困惑。

调用代码:

StreamWriter SW = new StreamWriter("c:\\test.txt"); int x = 100; while (x >0) { SW.WriteLine(RandomString(20)); x--; } 

这是方法:

 private static string RandomString(int Length) { StringBuilder sb = new StringBuilder(); Random randomNumber = new Random(); for (int i = 0; i <= Length; ++i) { int x = randomNumber.Next(65, 122); sb.Append(Convert.ToChar(x)); } return sb.ToString(); } 

这是输出:

 "VEWMCQ`Fw]TvSFQawYnoB VEWMCQ`Fw]TvSFQawYnoB VEWMCQ`Fw]TvSFQawYnoB VEWMCQ`Fw]TvSFQawYnoB VEWMCQ`Fw]TvSFQawYnoB VEWMCQ`Fw]TvSFQawYnoB .................. VEWMCQ`Fw]TvSFQawYnoB VEWMCQ`Fw]TvSFQawYnoB VEWMCQ`Fw]TvSFQawYnoB VEWMCQ`Fw]TvSFQawYnoB VEWMCQ`Fw]TvSFQawYnoB" 

那么是什么让我觉得Random.next()会一直返回一个新的随机数?

您正在及时创建Random实例。 每个实例都使用系统时钟初始化,并且由于时钟没有改变,您可以反复获得相同的随机数序列。

创建Random类的单个实例并反复使用它。

使用using关键字,以便在完成后关闭并处理StreamWriter 。 如果使用for关键字for则更容易识别循环代码。

 using (StreamWriter SW = new StreamWriter("c:\\test.txt")) { Random rnd = new Random(); for (int x = 100; x > 0; x--) { SW.WriteLine(RandomString(rnd, 20)); } } 

该方法将Random对象作为参数。

另外,使用length来初始化StringBuilder并使用正确的容量,这样它就不必在循环期间重新分配。 在循环中使用<运算符而不是<=,否则将创建一个比length参数指定的字符长一个字符的字符串。

 private static string RandomString(Random rnd, int length) { StringBuilder sb = new StringBuilder(length); for (int i = 0; i < length; i++) { int x = rnd.Next(65, 122); sb.Append((char)x); } return sb.ToString(); } 

请参阅MSN上的随机构造函数说明 ,此部分:

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

因此,要么在程序开头只调用一次Random()构造函数,要么使用Random(int32)构造函数并自己定义变量种子。

因为您在每次调用中都创建了一个新的Random对象。

只需将randomNumber移出方法,并使其成为类成员。

 private Random randomNumber = new Random(); private static string RandomString(int Length) { StringBuilder sb = new StringBuilder(); //... } 

所有软件随机生成器都是“伪随机”,它们根据(起始)种子生成一系列数字。 使用相同的种子,它们产生相同的序列。 有时这很有用。 如果要生成程序以在每次运行时生成相同的序列,则可以使用new Random(0)

编辑:显然.Net Random类是自动播种,我不知道。 正如其他人所指出的那样,这是一个时间问题。

只声明randomNumber一次

 public class MyClass { private static Random randomNumber = new Random(); private static string RandomString(int Length) { StringBuilder sb = new StringBuilder(); for (int i = 0; i ... Length; ++i) { int x = MyClass.randomNumber.Next(65, 122); sb.Append(Convert.ToChar(x)); } return sb.ToString(); } } 

类似的问题,很多答案:

随机字符串生成 – 一个接一个地生成两个给出相同的结果

由于所需的时间很短,随机数的种子都是相同的,实际上每次都使用相同的种子重新创建随机生成器,因此Next()调用返回相同的随机值。