C# の乱数ジェネレーターによるスレッドの安全性の確保
C# の組み込み Random.Next()
メソッドはスレッドセーフではありません。 マルチスレッド アプリケーションで使用すると、競合状態により不正確な結果が生じる可能性があります。 幸いなことに、スレッドセーフなバージョンの作成は簡単です。
スレッドセーフな乱数ジェネレーター
次の ThreadSafeRandom
クラスは、スレッドの安全性を保証するためにスレッド静的変数を使用したソリューションを提供します。各スレッドは独自の独立した Random
インスタンスを取得します。
public class ThreadSafeRandom { private static readonly Random _global = new Random(); [ThreadStatic] private static Random _local; public int Next() { if (_local == null) { int seed; lock (_global) { seed = _global.Next(); } _local = new Random(seed); } return _local.Next(); } }
一意の乱数のシード管理
複数の Random
インスタンスに関する一般的な問題は、特に立て続けに作成された場合に、類似または同一の番号が生成されることです。 この実装では、グローバル Random
インスタンス (_global
) を使用して、スレッドローカルの Random
インスタンス (_local
) ごとに一意のシードを生成することで、この問題に対処しています。 lock
ステートメントは、シード生成のためにグローバル Random
にアクセスする際の競合状態を防ぎます。
この方法では、スレッドごとに個別のシードが確保され、真にランダムで独立した数値シーケンスが得られます。 開発者は、非スレッドセーフなアプローチの落とし穴を回避して、マルチスレッド アプリケーション内で乱数生成を安全に使用できるようになりました。
以上がC# でスレッドセーフな乱数ジェネレーターを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。