【问题标题】:random string generation - two generated one after another give same results随机字符串生成 - 两个一个接一个产生相同的结果
【发布时间】:2010-09-27 10:36:02
【问题描述】:

我有一段简单的代码:

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;
        }

如果我调用这个函数来生成两个字符串,一个接一个,它们是相同的......但是如果我通过生成字符串的两行进行调试 - 结果是不同的。 有谁知道为什么会这样?

【问题讨论】:

  • 你的代码甚至没有编译——它的其余部分在哪里?

标签: c# string random


【解决方案1】:

发生这种情况,因为调用彼此非常接近(在同一毫秒内),因此 Random 构造函数将为 Random 对象播种相同的值(默认情况下使用日期和时间)。

所以,实际上有两种解决方案。

1.提供您自己的种子值,该值在您每次构造 Random 对象时都是唯一的。

2。始终使用相同的 Random 对象 - 只构造一次。

就个人而言,我会使用第二种方法。可以通过将 Random 对象设为静态或使其成为类的成员来完成。

【讨论】:

  • 是的,Random 根据当前时间选择初始种子,因此小的时间增量会给出相同的种子。
  • 好的,我将我的答案扩展为更完整,包括不是一个,而是两个解决方案(我仍然推荐我之前给出的那个)。
  • 经过数小时的努力才偶然发现,谢谢!
【解决方案2】:

Random 的默认构造函数(您正在使用的构造函数)为生成器提供基于当前时间的值。如果在第一次和第二次调用函数之间以毫秒为单位的时间没有变化,它将使用相同的随机种子。

我的建议是使用静态 Random 对象,并且只初始化一次。

【讨论】:

    【解决方案3】:

    这是因为您同时创建了两个随机对象。这是给它相同的种子,所以你会得到相同的数字。

    当您调试它时,在创建随机对象之间有一段时间,这允许它们获得不同的种子。

    【讨论】:

      【解决方案4】:

      以上答案都是正确的。不过,我建议对您的代码进行以下更改:

      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();
      }
      

      【讨论】:

        【解决方案5】:

        由于Random 生成器与系统时钟绑定,您可能在该时间段内显示相同的结果。有几种方法可以纠正。如果您使用循环,请将 Random rnd = new Random(); 放在循环之外。

        在声明变量的地方放置Random rnd = new Random(); 行,并在整个程序中使用相同的变量(本示例为rnd)。

        这在大多数情况下都有效。

        【讨论】:

          猜你喜欢
          • 2013-10-01
          • 2017-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-18
          • 2014-04-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多