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

Cra*_*893 5 .net c# random text char

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

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

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

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

调用代码:

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

这是方法:

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();        
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

"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"
Run Code Online (Sandbox Code Playgroud)

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

Guf*_*ffa 25

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

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

使用using关键字,以便在完成后StreamWriter关闭并处理它.如果使用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));
   }
}
Run Code Online (Sandbox Code Playgroud)

该方法将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();        
}
Run Code Online (Sandbox Code Playgroud)


sch*_*der 12

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

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

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