C# での乱数生成の理解とシーケンスの繰り返しの回避
この記事では、C# の一般的な問題、つまり、Random
クラスの複数のインスタンスが同一の乱数シーケンスを生成する問題について説明します。 Random
クラスは、一見予測不能な数値を生成するように設計されていますが、内部アルゴリズムのシード値に依存しています。 複数の Random
オブジェクトが立て続けに作成される場合、多くの場合、同様のシード値 (多くの場合システム クロックに基づく) を受け取り、その結果、同一の出力シーケンスが生成されます。
問題: 複数の Random
インスタンス
乱数を必要とするオブジェクトごとに新しい Random
インスタンスを作成することが根本的な原因です。 シード値が互いに近いため、生成されたシーケンスはほぼ同一です。
解決策: 単一の共有 Random
インスタンス
解決策は簡単です。単一の Random
インスタンスを作成し、乱数を必要とするすべてのオブジェクト間でそれを共有します。 これにより、各オブジェクトが同じ進化するシーケンスから描画されることが保証され、繰り返しの問題が防止されます。
静的メンバーを使用してこれを実装する方法は次のとおりです。
<code class="language-csharp">class A { private static readonly Random rnd = new Random(); // Static, read-only instance public void Count() { int r1 = rnd.Next(-1, 1); int r2 = rnd.Next(-1, 1); } } class B { List<A> listOfA = new List<A>(); public void DoSomething() { foreach (A aClass in listOfA) { aClass.Count(); } } }</code>
static readonly
フィールドを使用することで、単一の Random
インスタンスが一度作成され、クラス A
のすべてのインスタンスで共有されるようになります。これにより、シード値が重複するリスクが排除され、rnd.Next()
の呼び出しごとに一意の乱数シーケンスが保証されます。 このアプローチでは、各 A
オブジェクトに対して真にランダムで個別のシーケンスが生成されます。
以上がC# 乱数ジェネレーターが複数のオブジェクトにわたって同じシーケンスを生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。