なぜ' srand(time(NULL))'を実行する必要があるのですか? C ++で乱数を生成するために?


ベストアンサー

Abhilash Gangadharanが提供したよりも良い答えを出すことはできません。標準の「srand()」関数Cライブラリは、疑似乱数アルゴリズムが半一意の出力を生成するために必要ないくつかの値を初期化します。

一部の古いジェネレータでは、モジュロプライムなどのように、値を直接使用してシステムをジャンプスタートしました。計算に「エントロピー」を追加し、結果をランダムに表示するために、最近生成された数値からのフィードバックを使用した計算。最近のアルゴリズム(やや有名な「MersenneTwister」など)にも同様のフィードバックシステムがありますが、使用方法が異なります。大量のエントロピーを提供します。これにより、生成された一連の数値が、より多くの乱数の統計テストに合格します。

PRNGに特定の値をシードすると、常にまったく同じ出力が得られます-したがって、あるコードで「srand(12345)」を呼び出すと、14Dで「231,4492,2131」が生成されます。 EC2015、2016年12月14日にまったく同じ結果を得ることができます。 (これは、私の研究を正しく覚えていれば、暗号化の一部で実際に使用され、一部のアルゴリズムのセキュリティを強化しています)

回答

これは、乱数ジェネレーターの「シード」と呼ばれます。 。これにより、固定シードを使用する場合、または時間などのシステムパラメータを使用する場合に、同じ乱数シーケンスを生成できます。毎回異なるシードから開始して、異なる乱数シーケンスを使用できます。これは、確率シミュレーションの結果が乱数シーケンスの予測可能性の影響を受けていないかどうかを確認するのに役立ちます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です