麻烦C#随机类

时间:2010-09-25 01:19:02

标签: c# random

我有一个代表硬币的类,可以用Coin.Flip()方法翻转。 Flip()使用random.Next(2);获得表示头部或尾部的0或1。这很好..有点。

对于程序,我需要有2个硬币,我可以说硬币1和硬币2。

coin2总是需要在coin1之后直接翻转,我可以这样做:

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

这应该有效,对吧?

嗯,它没有!每次我运行这两行代码时,两个硬币最终都会有相同的值!

面值存储在Coin类中的face中,其定义如下:

private int face;

我没有看到我所做的事情有任何问题,但每次运行代码时,它们都会完全相同。

哦,同样,随机也在Coin类中定义,如此:

private Random random = new Random();

感谢您的帮助!

编辑:这是Flip(),现在可以使用random是静态的。

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

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:3)

我的猜测是,您可能希望在课程级别重新定义random变量,如下所示:

private static Random random = new Random();

这将使对Flip()的每次调用都使用相同的生成器,而不是不断重新调整。如果您在每次调用时创建Random实例,并且非常接近两次调用,则可能会获得相同的种子,因此值相同。