C# 如何让一行中的两个随机数给出不同的值?

C# 如何让一行中的两个随机数给出不同的值?,c#,C#,例如,如果我有一个类: public class Class { public Random r; public Class() {r= new Random()} } 然后创建它的两个实例: Class a = new Class(); Class b = new Class(); 然后依次调用r,两者的r将给出相同的值。我读到这是因为随机的默认构造函数使用时间提供“随机性”,所以我想知道如何防止这种情况。提前谢谢 实现这一点的一种方法是使r静态化 static意味着只有一个Random

例如,如果我有一个类:

public class Class
{
public Random r;

public Class()
{r= new Random()}
}
然后创建它的两个实例:

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

然后依次调用r,两者的r将给出相同的值。我读到这是因为随机的默认构造函数使用时间提供“随机性”,所以我想知道如何防止这种情况。提前谢谢

实现这一点的一种方法是使
r
静态化

static
意味着只有一个
Random r
将存在,并且它将在类的所有实例中共享

您的代码如下所示:

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

Class a = new Class();
Class b = new Class();
如果您使用的是线程,那么可以将其设置为
[ThreadStatic]
(这样每个线程都使用自己的随机类实例)


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

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


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

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

public class Class{
  private static Random r = new Random();        
  //the rest of your class
}
问题是,您几乎同时创建两个类,因此它们将使用相同的种子(因为它基于当前时间等),并将生成相同的数字序列。

尝试以下方法:

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