【问题标题】:Random numbers for dice game [duplicate]骰子游戏的随机数[重复]
【发布时间】:2011-07-18 14:07:42
【问题描述】:

可能重复:
random string generation - two generated one after another give same results

我正在为 windows phone 7 编写一个简单的骰子游戏,其中涉及同时掷两个骰子。这是我的掷骰子代码:

 private int DiceRoll()
    {
        int result;
        Random rnd = new Random();

        result = rnd.Next(1, 7);
        return result;
    }

然后我有这个代码,当一个按钮被点击时掷骰子:

   private void roll_Click(object sender, RoutedEventArgs e)
    {
        roll1 = DiceRoll();
        roll2 = DiceRoll();}

我的问题是两个死都得到相同的结果。

知道如何获得一个滚动算法,它通常会返回不同的结果,但偶尔会返回相同的结果吗?

【问题讨论】:

    标签: c# silverlight windows-phone-7 random dice


    【解决方案1】:

    Random 的默认种子基于当前时间。引用文档,

    因此,通过调用默认构造函数连续创建的不同 Random 对象将具有相同的默认种子值,因此将产生相同的随机数集。这个问题可以通过使用单个 Random 对象生成所有随机数来避免。

    这正是您应该做的:创建一个 Random 实例并使用它来生成所有随机数。

    【讨论】:

      【解决方案2】:

      如果您在单个应用程序中分配两个或更多随机对象,我见过的大多数“随机数”工具都会严重失败。您为每次调用分配一个新的 Random 对象,并且每次它们都将被植入一些非常弱的、甚至可能相同的种子。

      因此,生成一个单个 Random 对象并在应用程序的整个生命周期中使用它。

      【讨论】:

        【解决方案3】:

        您需要保留一个 Random 对象并重复使用它;每次创建一个新的 Random 对象时,都会有效地将数字序列重置为从同一位置开始。将 Random 对象作为成员变量存储在某个地方。您还需要在每次运行程序时为其设置不同的值,例如,基于系统时钟时间的值。

        【讨论】:

        • C# 中的 random 函数不会自动从系统时间播种吗?
        • 正确,除了你不必播种,它已经播种了一个与时间相关的值 (msdn.microsoft.com/en-us/library/h343ddh9.aspx)
        • @BigPete:你说得对,默认种子是基于系统时间的。
        • @BigPete:正确,但是如果您快速连续创建两个 Random 对象,由于系统时间的有限分辨率,它们可能具有相同的种子。
        猜你喜欢
        • 1970-01-01
        • 2016-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-28
        • 1970-01-01
        • 2016-03-22
        • 2012-02-29
        相关资源
        最近更新 更多