5

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

当我逐步执行代码时,它正常运行并且“结果”包含正确数量的抛出结果并且它们似乎是随机的,当我让代码运行并执行完全相同的事情时,它会产生一组相同的数字。

我确信这是一个我看不到的逻辑错误,但摆弄了几个小时并没有改善这种情况,所以任何帮助都是非常重要的。:)

    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;
    }
}
4

5 回答 5

12

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

于 2009-09-29T13:34:30.467 回答
5

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

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

于 2009-09-29T13:36:00.843 回答
1

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

见这里:来自 MSDN

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

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

例如,创建一个 Random 的私有实例...

于 2009-09-29T13:39:08.043 回答
1

除了前面提到的...

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

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

除非您有安全需要,否则不要使用它。性能低于 Random 类。我想你可以用它来播种 Random 但这可能是矫枉过正。

编辑:我突然想到我从来没有测试过这个。快速性能测试显示以下内容:

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

所以 Random 大约快 150 倍。

于 2009-09-29T13:58:24.250 回答
-1

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

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

Random r = new Random(DateTime.Now.Millisecond);
于 2009-09-29T13:34:25.837 回答