0

重複の可能性:
乱数ジェネレーターは、1つの乱数
クラスSystem.Randomのみを生成します。なぜ静的ではないのですか?

RandomGenerator値が1つしかないというパブリック静的クラスがありますpublic static random = new Random();

これはそれがどのように見えるかです

    public static class RandomGenerator
    {
        public static Random random = new Random(); 
    }

私のコードがランダムにアクセスしようとすると、重複するコピーが多すぎるため、これを行う必要がありました(メモリ内のランダムの場所と関係があると思います)

上記のコードはうまく機能します!私のコードは、呼び出されるたびに真にランダムな値を生成します。私の質問は、なぜランダムにC#言語の組み込み静的関数ではないのですか?この方法で何かにアクセスすると、パフォーマンスが低下するためですか?コードの記述方法に顕著なパフォーマンスの問題はありますか?

4

3 に答える 3

6

MSDNは、ランダムコンストラクターについて次のように記述しています。

デフォルトのシード値はシステムクロックから取得され、有限の解像度を持っています。その結果、デフォルトコンストラクターの呼び出しによって連続して作成されるさまざまなランダムオブジェクトは、同一のデフォルトシード値を持つため、同一の乱数セットが生成されます。この問題は、単一のRandomオブジェクトを使用してすべての乱数を生成することで回避できます。また、システムクロックによって返されるシード値を変更し、この新しいシード値をRandom(Int32)コンストラクターに明示的に提供することで回避することもできます。

http://msdn.microsoft.com/en-us/library/h343ddh9.aspx

于 2012-12-27T08:58:19.783 に答える
2

あなたが説明している問題は、ランダムであるか静的でないかとは何の関係もありません。ランダムインスタンスを作成してから、このインスタンスからランダムな値を取得していると思います。このようにして、すべてのランダムは、秒の精度で現在の時刻であるデフォルトのシードを使用して作成されました。ランダムインスタンスが同じシードで作成されたため、1秒間に同じ値を取得していました。

于 2012-12-27T08:56:15.590 に答える
2

.Netの「ランダム」な数値は真にランダムではないため、ネイティブに静的ではありません。つまり、「疑似ランダム」です。つまり、統計には十分にランダムですが、暗号化には十分にランダムではありません。つまり、それらは範囲全体に均等に分散されますが、シードパラメータが与えられると、次の「ランダム」値がどうなるかを予測できます。そのため、乱数を取得するには(上記のように)Randomクラスをインスタンス化する必要があります。新しいインスタンスを作成してシードする必要があります(手動でシードしない場合は、現在のタイムスタンプを使用してシードします)。 )、次に「次へ」の乱数値を取得します。Randomクラスに同じ値をシードすると、同じ一連の「乱数」が生成されます。シードは常に変化するため、システム時間を使用すると非常に効果的です。

このような静的な「Random」クラスを持つことは、必要なたびに新しいオブジェクトをインスタンス化せずにランダムな値を取得する1つの方法ですが、ここで行うのは、とにかく新しいコピーをインスタンス化することだけです。これをより効果的に行う方法は、次のようになります。

class RandomNumber {static readonly Random r = new Random();

    public static Int32 GetNext(int maxValue)
    {
        return r.Next(maxValue);
    }

    public static Int32 GetNext()
    {
        return r.Next();
    }
}

このように、インスタンス化するのは1回だけで、そのインスタンスを再利用し続けます。新しい乱数が必要になるたびに、静的クラスでGetNextメソッドを呼び出すだけで(上限を指定するかどうかに関係なく)、新しい番号を取得します。

于 2012-12-27T08:59:05.527 に答える