C# 乱数ジェネレーターにおけるスレッドの安全性の問題
ソフトウェア開発では、マルチスレッド環境で共有リソースへの安全なアクセスを確保することが重要です。 C# の Random.Next()
メソッドは乱数の生成に使用されますが、そのスレッドの安全性については検討する価値があります。
Random.Next()
はスレッドセーフですか?
いいえ。複数のスレッドが同じ Random.Next()
インスタンスを同時に使用すると、予期しない動作が発生したり、一連のゼロ値が発生したりする可能性があります。
スレッドセーフな乱数ジェネレーターを作成します
Random
クラスのスレッドセーフ バージョンを作成するには、次のアプローチをお勧めします。
<code class="language-csharp">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(); } }</code>
仕組み:
このクラスは、スレッドごとに一意の静的 Random
インスタンスを維持することでスレッド セーフを実現します。新しいスレッドがこのクラスにアクセスすると、グローバル Random
インスタンスからシード値が生成され、シーケンスがスレッドごとに一意であることが保証されます。
Random
の軽微な問題を解決しました
Random
クラスには、短期間 (15 ミリ秒以内) に複数のインスタンスが作成された場合、同じシーケンスを返す可能性があるという機能もあります。この問題を軽減するには、グローバル Random
インスタンスを使用してシードを生成し、競合を防ぎます。
結論:
C# Random.Next()
のスレッド セーフ制限を理解し、スレッド セーフ バージョンを実装すると、マルチスレッド アプリケーションで信頼性の高い乱数生成を保証できます。
以上がC# の Random.Next() はスレッドセーフですか? スレッドセーフな代替関数を作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。