生成的随机数总是相等的

时间:2012-05-15 09:38:20

标签: c# random

我有一个班级:

public class MyClass
{
    public int MyMethod()
    {
        Random rand = new Random();

        return rand.Next() % 10 + 1;
    }
}

它的两个对象:

MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();

问题在于obj1.MyMethod() == obj2.MyMethod()总是如此。为什么会这样?什么是避免它的最好方法?

2 个答案:

答案 0 :(得分:9)

创建随机对象静态

public class MyClass
{
   public static Random rand = new Random();

   public int MyMethod()
   {
       return rand.Next() % 10 + 1;
   }
}

随机适用于System.DatTime.Now.Ticks

如果我们喜欢这个

Random rand = new Random();

内部以

发生
Random rand = new Random(System.DateTime.Now.Ticks);

想一想,系统中唯一不稳定的是系统时间。

当使用Random类时,将其对象设置为一次并使用其方法Next()。当在循环内创建随机对象时,您会在循环中找到这种情况。

在你的代码中,它们是一个接一个地创建的,它们是由相同的Ticks种子值创建的。

创建随机对象静态然后它们将不相同。

答案 1 :(得分:0)

您每次都在创建新的Random。当您创建Random的新实例而未明确指定种子值时,它会使用System.DatTime.Now.Ticks作为种子。由于调用的速度,它们发生在相同的“Tick”,因此使用相同的种子值。由于所有Random实例为相同的种子值生成完全相同的“随机”数字序列,因此两个实例都会生成相同的“随机”值。

之前已在网站上多次介绍过这个问题,您应该搜索其中一个答案。

但基本上你需要创建一次Random对象并重用它。这可以静态完成,或者至少作为类变量。

您应该阅读this question及其答案以找到更好的方法。