ホームページ >バックエンド開発 >C++ >C# 乱数ジェネレーターが複数のオブジェクトにわたって同じシーケンスを生成するのはなぜですか?

C# 乱数ジェネレーターが複数のオブジェクトにわたって同じシーケンスを生成するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-24 23:26:09330ブラウズ

Why Does My C# Random Number Generator Produce the Same Sequence Across Multiple Objects?

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

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