如何让两个随机数连续给出不同的值

本文关键字:连续 随机数 两个 | 更新日期: 2023-09-27 17:59:11

例如,如果我有一个类:

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

然后创建两个实例:

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

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

如何让两个随机数连续给出不同的值

实现这一点的一种方法是使r成为static

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

你的代码应该是这样的:

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

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

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

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

因此,您需要以某种方式为您的类共享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);
    }
}