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

「Random rnd = new Random();」を作成すると 現在時刻によってシードされます。コードをデバッグすると (時間がかかります)、毎回異なる方法でシードされます。

Random のインスタンスを 1 つ作成し、それをどこでも参照します。

于 2009-09-29T13:36:00.843 に答える
1

番号を作成する必要があるたびに、ランダムなクラスを作成しています。これを行うと、ナッツのような結果が得られます。

ここを参照してください:FROM MSDN

この問題は、複数のオブジェクトではなく単一のランダムオブジェクトを作成することで回避できます。

パフォーマンスを向上させるには、新しいRandomオブジェクトを繰り返し作成して1つの乱数を生成するのではなく、1つの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 秒 Random: .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 に答える