为什么这个方法每次都返回相同的随机字符串?
我需要创建一个独特的块来测试我正在处理的不同项目。
所以我创建了一个简单的程序来生成一个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()调用返回相同的随机值。