C# 骰子游戏中的随机数

C# 骰子游戏中的随机数,c#,silverlight,windows-phone-7,random,dice,C#,Silverlight,Windows Phone 7,Random,Dice,可能重复: 我正在为WindowsPhone7编写一个简单的骰子游戏,包括同时掷两个骰子。这是我的掷骰子代码: private int DiceRoll() { int result; Random rnd = new Random(); result = rnd.Next(1, 7); return result; } 然后我有一个代码,当点击按钮时掷骰子: private void roll_Cli

可能重复:

我正在为WindowsPhone7编写一个简单的骰子游戏,包括同时掷两个骰子。这是我的掷骰子代码:

 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();}
我的问题是,两者都会得到相同的结果


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

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

如果在单个应用程序中分配两个或多个随机对象,我看到的绝大多数“随机数”工具都会严重失败。每次调用都会分配一个新的
随机
对象,每次调用都会添加一些非常弱的种子,甚至可能是相同的种子


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

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

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


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

C#中的Random函数不是自动从系统时间开始播种吗?正确,除了您不必播种外,它已经播种了一个时间相关的值()@Bigpet:you's Correct,默认种子基于系统时间。@BigPete:正确,但如果您快速连续创建两个随机对象,它们可能具有相同的种子,因为系统时间的分辨率有限。