C#代码仅在步骤中给出预期结果?

时间:2009-09-29 13:33:03

标签: c# debugging logic dice

好的,所以我有一个掷骰子的应用......

当我单步执行代码时,它正常运行,'结果'包含正确的投掷结果数,并且它们看起来是随机的,当我让代码运行并执行完全相同的操作时它产生一组相同的数字

我确信这是一个我无法看到的逻辑错误,但摆弄它几个小时并没有改善这种情况,所以任何帮助都很有用。 :)

    class Dice
{

    public int[] Roll(int _throws, int _sides, int _count)
    {
        Random rnd = new Random();
        int[] results = new int[_throws];
        // for each set of dice to throw pass data to calculate method
        for (int i = 0; i < _throws; i++)
        {
            int thisThrow = Calculate(_sides, _count);
            //add each throw to a new index of array... repeat for every throw
            results[i] = thisThrow; 
        }

        return results;
    }


    private int Calculate(int _sides, int _count)
    {
        Random rnd = new Random();
        int[] result = new int[_count];
        int total = 0;
        //for each dice to throw put data into result
        for (int i = 0; i < _count; i++)
        {
            result[i] = rnd.Next(1, _sides);
        }
        //count the values in result
        for (int x = 0; x < _count; x++)
        {
            total = total + result[x];
        }
        //return total of all dice to Roll method
        return total;
    }
}

5 个答案:

答案 0 :(得分:12)

第一个错误:永远不要使用Random的多个实例,使用单个实例,并将其与其他参数一起传递。

答案 1 :(得分:5)

创建“Random rnd = new Random();”时它是按当前时间播种的。当您调试代码时(需要时间),每次都会以不同的方式播种。

创建一个Random实例,并在任何地方引用它。

答案 2 :(得分:1)

每次需要创建数字时,您都会创建一个随机类。这样做会给你带来坚果的结果。

见这里:FROM MSDN

通过创建单个Random对象而不是多个Random对象可以避免此问题。

要提高性能,请创建一个Random对象以随时间生成许多随机数,而不是重复创建新的Random对象以生成一个随机数。

E.g。创建一个随机的私有实例...

答案 3 :(得分:1)

除了之前提到过的内容......

使用随机的东西,如骰子,纸牌游戏,选择随机图像等。如果出于安全考虑需要创建随机数,请使用System.Security.Cryptography.RandomNumberGenerator。这个简单的例子显示了创建一个随机整数。

        RandomNumberGenerator gen = RandomNumberGenerator.Create();
        byte[] myBytes = new byte[4];
        gen.GetBytes(myBytes);
        int myValue = (BitConverter.ToInt32(myBytes, 0));

除非您有安全需要,否则请勿使用此功能。性能低于Random类的性能。我想你可以用它来种子随机,但这可能有点过分。

编辑:我突然想到我从未测试过这个。快速性能测试显示如下:

1,000,000个随机数: RandomNumberGenerator:2.6秒 随机:.015秒。

所以随机性快了约150倍。

答案 4 :(得分:-1)

给构造函数Random一个种子。这就是问题所在。

http://msdn.microsoft.com/en-us/library/aa329890%28VS.71%29.aspx

Random r = new Random(DateTime.Now.Millisecond);