【问题标题】:Random number in a loop [duplicate]循环中的随机数[重复]
【发布时间】:2011-03-04 11:40:24
【问题描述】:

在循环中生成随机数时遇到问题。可以通过使用 Thread.Sleep 解决它,但需要更优雅的解决方案。

for ...
    Random r = new Random();
    string += r.Next(4);

会以 11111... 222... 等结束。

建议?

【问题讨论】:

  • 如果这个循环不止几次迭代,你会想要放弃字符串连接以支持StringBuilder对象。
  • @Anthony:不,他每次迭代都需要更多次。
  • @Henk... 显然。我是否可以建议使用单个空格的多个串联的嵌套 for 循环,然后立即用 string.Empty 替换单个空格。

标签: c# random


【解决方案1】:

将随机数生成器的声明移出循环。

随机数生成从种子值开始。如果重复使用相同的种子,则会生成相同的数字序列。产生不同序列的一种方法是使种子值与时间相关,从而为每个新的 Random 实例产生不同的序列。默认情况下,Random类的无参构造函数使用系统时钟来生成它的种子值,...

Source

通过在循环中声明,您实际上是一次又一次地调用具有相同值的构造函数 - 因此您得到相同的数字。

所以你的代码应该变成:

Random r = new Random();
for ...
    string += r.Next(4);

【讨论】:

    【解决方案2】:
    Random r = new Random(); 
    for ... 
        string += r.Next(4); 
    

    new Random() 将根据当前日期和时间使用种子初始化(伪)随机数生成器。因此,在同一日期和时间创建的两个 Random 实例将产生相同的数字序列。

    您在每次迭代中创建了一个新的随机数生成器,然后获取该序列的第一个值。由于随机数生成器相同,因此它们序列的第一个值相同。我的解决方案将创建 one 随机数生成器,然后返回序列的第一个、第二个等...值(会有所不同)。

    【讨论】:

      【解决方案3】:

      您应该始终使用相同的 Random 实例,而不是每次都创建一个新实例。

      如你所愿:

      for ...
          Random r = new Random();
          string += r.Next(4);
      

      每个种子值都相同(默认为当前时间戳),因此返回的值相同。

      通过像这样重用单个 Random 实例:

      Random r = new Random()
      for ...
          string += r.Next(4);
      

      每次调用 r.Next(4) 时,值都会更新(基本上每次调用都有不同的种子)。

      【讨论】:

        【解决方案4】:

        Random r = new Random();移到循环外,然后在循环内调用next。

        【讨论】:

        • 我应该重新加载页面。大声笑每个人都有相同的答案
        • 问题是“循环内部”
        • @Mironline 也许您没有阅读我的全部答案,我还声明要离开“循环中的下一个”。接受的答案与我描述的完全一样,所以我假设它符合 OP 的要求。
        【解决方案5】:

        我发现一个中文页面和时间一样:http://godleon.blogspot.hk/2007/12/c.html,它说如果你这样输入:

        Random random = new Random(Guid.NewGuid().GetHashCode());

        即使在循环中,您也可能得到一个随机数!它也解决了我的问题!

        【讨论】:

        • 为什么要慢,Guid.NewGuid().GetHashCode()就够了
        • @nawfal 我不太明白你在说什么??!!我不是这么做的吗?
        • 我的意思是Guid.NewGuid().GetHashCode() 会比new Random(Guid.NewGuid().GetHashCode()) 快。两者都给出随机整数
        • 中文页面使用这种特殊方法是为了减慢它的速度,以便它可以生成更多的随机数,因为循环中使用的随机数没有足够的时间生成。
        • 您可以在每个循环周期中使用简单的 int 增量,而不是使用新的 Guids 哈希码,这将更改构造函数中的随机种子参数。这种方法会更快。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-16
        • 1970-01-01
        • 2013-05-02
        • 2014-01-19
        • 1970-01-01
        相关资源
        最近更新 更多