【问题标题】:How do I have two randoms in a row give different values?如何连续有两个随机数给出不同的值?
【发布时间】:2011-09-16 01:57:45
【问题描述】:

例如,如果我有一个班级:

public class Class
{
public Random r;

public Class()
{r= new Random()}
}

然后创建它的两个实例:

Class a = new Class();
Class b = new Class();

并按顺序调用 r,两者的 r 将给出相同的值。我读过这是因为 Random 的默认构造函数使用时间来提供“随机性”,所以我想知道如何防止这种情况发生。提前致谢!

【问题讨论】:

    标签: c#


    【解决方案1】:

    实现这一目标的一种方法是使rstatic

    static 表示只存在一个Random r,它将在类的所有实例之间共享。

    您的代码将如下所示:

    public class Class() { static Random r = new Random(); }
    
    Class a = new Class();
    Class b = new Class();
    

    如果您使用线程,则可以将其设为[ThreadStatic](这样每个线程都使用自己的 Random 类实例)

    这里有关于如何使用 [ThreadStatic] here 的信息 - 我自己没用过,但它看起来很酷很漂亮,并且消除了任何潜在的线程相关问题。

    【讨论】:

      【解决方案2】:

      Random类的构造函数是基于时间的。因此,当您以快速顺序创建它们时 - 它们会获得相同的种子,然后会产生相同的值。

      因此,您需要以某种方式为您的课程共享 Random,-或-您自己提供不同的初始种子。

      【讨论】:

        【解决方案3】:

        在这种情况下,一种可能性是将 Random 设为静态,以便它只实例化一次。

        public class Class{
          private static Random r = new Random();        
          //the rest of your class
        }
        

        问题是您几乎同时创建了两个类,因此它们将使用相同的种子(因为它基于当前时间等),并且会产生相同的数字序列。

        【讨论】:

          【解决方案4】:

          试试这个:

          public class TestClass
          {
              private static int seed = Environment.TickCount;
          
          
              public TestClass()
              {
                  DoStuff();
                  DoStuff();
                  DoStuff();
                  DoStuff();
              }
          
              private void DoStuff()
              {
                  var random = new Random(seed++);
                  int index = random.Next(30) + 1;
          
                  //Console.Write(index);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2014-03-05
            • 2015-01-29
            • 1970-01-01
            • 1970-01-01
            • 2018-06-16
            • 2014-10-24
            • 2014-10-14
            • 2016-02-16
            • 1970-01-01
            相关资源
            最近更新 更多