ホームページ >バックエンド開発 >C++ >C で `rand()` を繰り返し使用すると、予測可能なシーケンスが生成されるのはなぜですか?

C で `rand()` を繰り返し使用すると、予測可能なシーケンスが生成されるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-25 15:55:17467ブラウズ

Why Does Repeated `rand()` Usage in C   Produce Predictable Sequences?

関数呼び出し内のランダム初期化の問題

C では、乱数を生成するために rand() 関数がよく使用されます。ただし、単一関数内で繰り返し呼び出される場合、真のランダム性ではなく、予測可能なシーケンスが生成される可能性があります。この動作は、複数の一意のランダム値が必要な場合に問題となる可能性があります。

この問題を修正するには、各 rand() 呼び出しの前にランダム ジェネレーター srand() を初期化しないようにする必要があります。代わりに、できればプログラムの開始時に一度だけ実行する必要があります。

問題の説明

予測できないシーケンスの理由は、srand() が特定の値を持つランダムジェネレーター。同じ関数内での後続の呼び出しでは同じシードが使用されるため、一貫した乱数のシーケンスが得られます。ジェネレーターを 1 回だけ初期化することで、プログラム全体で一意のシードが確実に使用されます。

改訂されたコード:

int GenerateRandomNumber()
{
    static bool srand_initialized = false;

    if (!srand_initialized)
    {
        srand(time(0));  // Initialize random generator once
        srand_initialized = true;
    }

    return rand() % 3;
}

この更新されたコードでは、srand () は、GenerateRandomNumber() を最初に呼び出す前に 1 回だけ初期化されます。これにより、各呼び出しが真にランダムな値を生成することが保証されます。

以上がC で `rand()` を繰り返し使用すると、予測可能なシーケンスが生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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