麻烦C#随机类
我有一个代表硬币的类,可以用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); }
随机数生成器需要种子值。 具有相同种子的RNG将产生相同的随机数流。
默认情况下,System.Random使用当前时间作为种子。 如果您几乎立即创建两个实例,它们将可能具有相同的时间值,因此将生成相同的随机数序列。
您可以将Random移动到静态成员,以便所有Coin共享相同的RNG,但要注意System.Random没有记录为线程安全,因此如果没有同步,您不能在不同的线程上使用多个Coin。
我的猜测是你可能想要在类级重新定义你的random
变量,如下所示:
private static Random random = new Random();
这将使每次调用Flip()
使用相同的生成器,而不是不断重新设置。 如果您在每次调用时创建Random
实例,并且非常靠近地调用两次,则可能会获得相同的种子,因此值相同。