C# 生成的随机数总是相等的

C# 生成的随机数总是相等的,c#,random,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(

我有一门课:

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()
总是这样。为什么会这样?避免它的最佳方法是什么?

创建您的随机静态对象

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()
。当在循环中创建随机对象时,您会在循环中发现这种情况

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


创建一个静态的随机对象,这样它们就不一样了。

您每次都在创建一个新的
random
。创建
Random
的新实例时,如果未明确指定种子值,它将使用
System.DatTime.Now.Ticks
作为种子。由于呼叫的速度,它们在同一个“滴答声”发生,因此使用相同的种子值。由于所有随机实例为相同的种子值生成完全相同的“随机”数序列,因此两个实例生成相同的“随机”值

这个问题在网站上已经讨论过很多次了,你应该搜索其中一个答案

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


你应该阅读它的答案以找到更好的方法。

他的意思是随机rnd=new Random((int)DateTime.Now.Ticks);谢谢你清楚的解释。只要系统允许,我会尽快接受。请查看静态实现可能不安全的原因。您需要锁定对
rand.Next
的访问,以防止随机数据的内部损坏instance@SamHolder:Marc Gravel的答案?@NikhilAgrawal是Marc Gravel的答案。