1

いくつかのプロジェクトで.NETのRandomクラスを使用しましたが、ランダムな値を返す静的メソッドではなく、インスタンスオブジェクトとして設計された理由がよくわかります。

例えば:

Random rnd = new Random()
int x = rnd.Next(0, 255);

これを実行できるように、インスタンスメソッドと静的メソッドの両方で設計されなかった理由、または設計上の選択はありますか?

int x = Random.Next(0, 255);

この機能が役立つと思うので、この機能が実装されなかった理由はありますか?

4

3 に答える 3

2

System.Random2つのコンストラクターがあります。1つはベアコンストラクターで、もう1つはシード(生成された乱数の基礎)を受け入れます。

これが静的メソッドの場合は、毎回シードを渡すか、何らかのデフォルトを許可する必要があります。

シードが本当に重要である理由について、このSOの質問を確認することをお勧めします。

ランダムな値が重複しないようにランダムクラスをシードするにはどうすればよいですか

于 2013-01-28T15:34:36.947 に答える
0

インスタンスオブジェクトとしてのRandomを使用すると、Randomgeneratorを構成できます。

異なるランダムオブジェクトに同一のシード値を提供すると、各インスタンスは同一の乱数シーケンスを生成します。

これは、たとえばテストするときに非常に便利になる可能性があります

ランダムコンストラクター(Int32)を参照してください

于 2013-01-28T15:36:04.957 に答える
0

あなたが提案するような静的Random.Nextメソッドがあった場合、それを同時に呼び出す複数のスレッドが状態を破壊しないように設計する必要があります。現在のRandomクラスは、複数の同時ユーザーをサポートしていません。

また、インスタンスが1つしかない場合はRandom、異なるランダムシーケンスに依存するコードの2つの部分を持つことはできません。グローバル乱数ジェネレーターを備えたCでコーディングするときに、この問題に何度も遭遇しました。結局、インスタンスごとのジェネレーターを作成する必要がありました。

乱数ジェネレーターを静的ではなくインスタンスクラスにすると、柔軟性が高まります。プログラムにグローバルを1つだけ必要とする場合は、静的Randomオブジェクトが1つしかない場合と同じように、グローバルスコープで宣言して使用します。最終的には1行の余分なコードになります。

于 2013-01-28T15:52:44.043 に答える