2012-05-15 195 views
1

我有一个类:它产生的随机数总是相等

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

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

而2个对象:

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

的问题是,obj1.MyMethod() == obj2.MyMethod()始终。为什么会发生?什么是避免它的最好方法?

回答

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()任何你想去的地方。在循环内部创建随机对象时,您会发现这种情况。

在代码中创建它们一个接一个,他们得到同样的蜱种价值创造。

创建你的随机对象静态,然后他们将不会相同。

+0

谢谢你的明确解释。只要系统允许,我会尽快接受。 – Leri

+1

请参阅[本答案](http://stackoverflow.com/a/768001/97614)为什么您的静态实现可能不安全。您需要锁定对'rand.Next'的访问以防止随机实例可能发生的内部损坏 –

+0

@SamHolder:Marc Gravell答案? –

0

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

这已被覆盖很多次在网站上,你应该搜索其中的答案。

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

你应该阅读this question及其答案找到一个更好的方法。

+0

他意思是这个Random rnd = new Random((int)DateTime.Now.Ticks); – bresleveloper