如何连续两个random给出不同的值?

时间:2011-06-16 05:20:03

标签: c#

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

public class Class
{
public Random r;

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

以后再创建它的两个实例:

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

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

4 个答案:

答案 0 :(得分:5)

实现这一目标的一种方法是制作r static

static表示只有一个Random r存在,并且会在所有类的实例中共享。

您的代码如下所示:

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

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

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

有关如何使用[ThreadStatic] here的信息 - 我自己没有使用它,但它看起来非常酷和漂亮,并且摆脱任何潜在的与线程相关的困境。

答案 1 :(得分:4)

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

所以你需要以某种方式为你的类分享Random -or - 自己提供不同的初始种子。

答案 2 :(得分:2)

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

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

问题在于你几乎同时创建了两个类,因此它们将使用相同的种子(因为它基于当前时间和其他事物),并将生成相同的数字序列。

答案 3 :(得分:1)

试试这个:

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