C#的问题随机类
我有一个代表硬币的类,可以用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);
}
随机数生成器需要种子值。具有相同种子的RNG将产生相同的随机数字流。
默认情况下,System.Random使用当前时间作为种子。如果您几乎立即创建两个实例,它们都可能具有相同的时间值,因此会生成相同的随机数字序列。
您可以将Random移动到静态成员,以便所有Coin共享相同的RNG,但请注意System.Random没有记录为线程安全,因此您不能在不同步的线程上使用多个Coin,而无需进行某些同步。
感谢队友,我在发布之后正在考虑这个权利。会给它一个镜头。 – Azz 2010-09-25 01:46:04
这是更好的。再次感谢! – Azz 2010-09-25 01:53:01
为您的Coin()创建一个重载可能是一个好主意,它允许您传递一个随机流,并且默认的构造函数使用静态随机流。通过这种方式,您可以通过为每个线程创建单独的rng来解决任何同步问题 – cordialgerm 2010-09-25 03:03:41
我的猜测是,你可能要重新定义你的random
变量,在类的级别,如:
private static Random random = new Random();
这将使到Flip()
每次调用使用相同的发电机,而不是不断补种。如果您为每次调用创建Random
实例,并且将两次调用非常靠近,则可能会得到相同的种子,因此也会得到相同的值。
你能展示Flip的实现吗? – 2010-09-25 01:21:55
注意:如果它是静态的,你应该同步它,或者使它具体线程,因为它没有被列为线程安全 – 2010-09-25 06:59:41