2010-09-25 71 views
4

我有一个代表硬币的类,可以用Coin.Flip()方法翻转。 Flip()使用random.Next(2);得到0或1代表正面或反面。这工作很好..有点。C#的问题随机类

对于该程序,我需要有2个硬币,我可以说让coin1和coin2。

COIN2总是需要COIN1后直奔翻转,我可以用做:

coin1.Flip(); 
coin2.Flip(); 

这应该工作,对不对?

那好吧!每次运行这两行代码时,两个硬币的结果都相同!

面值存储在脸上币类,它是这样定义里面:

private int face; 

我看不出有什么毛病我都干了些什么,但每一次我运行代码,它们最终完全相同。

哦也,随机在硬币类中定义的,以及像这样:

private Random random = new Random(); 

感谢您的帮助!

编辑:这里的翻转(),它的工作原理是,随机是静态的。

public void Flip() { 
     face = random.Next(2); 
    } 
+0

你能展示Flip的实现吗? – 2010-09-25 01:21:55

+0

注意:如果它是静态的,你应该同步它,或者使它具体线程,因为它没有被列为线程安全 – 2010-09-25 06:59:41

回答

6

随机数生成器需要种子值。具有相同种子的RNG将产生相同的随机数字流。

默认情况下,System.Random使用当前时间作为种子。如果您几乎立即创建两个实例,它们都可能具有相同的时间值,因此会生成相同的随机数字序列。

您可以将Random移动到静态成员,以便所有Coin共享相同的RNG,但请注意System.Random没有记录为线程安全,因此您不能在不同步的线程上使用多个Coin,而无需进行某些同步。

+0

感谢队友,我在发布之后正在考虑这个权利。会给它一个镜头。 – Azz 2010-09-25 01:46:04

+0

这是更好的。再次感谢! – Azz 2010-09-25 01:53:01

+0

为您的Coin()创建一个重载可能是一个好主意,它允许您传递一个随机流,并且默认的构造函数使用静态随机流。通过这种方式,您可以通过为每个线程创建单独的rng来解决任何同步问题 – cordialgerm 2010-09-25 03:03:41

3

我的猜测是,你可能要重新定义你的random变量,在类的级别,如:

private static Random random = new Random(); 

这将使到Flip()每次调用使用相同的发电机,而不是不断补种。如果您为每次调用创建Random实例,并且将两次调用非常靠近,则可能会得到相同的种子,因此也会得到相同的值。