ホームページ >バックエンド開発 >C++ >C# の Random.Next() はスレッドセーフですか? スレッドセーフな代替関数を作成するにはどうすればよいですか?

C# の Random.Next() はスレッドセーフですか? スレッドセーフな代替関数を作成するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-21 02:51:17808ブラウズ

Is C#'s Random.Next() Thread-Safe, and How Can You Create a Thread-Safe Alternative?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。