新しいランダム ライブラリは rand() よりも優れているのはなぜですか?
rand() に関する現代の懸念により、優れた乱数の利用に関する議論が引き起こされています従来の std::rand() およびモジュロ アプローチとは対照的に、エンジン分散パラダイムに基づく生成 (RNG) プロシージャ。 rand() の欠点を直接理解するために、簡単な実験が行われました。
std::rand() と std を利用して、getRandNum_Old() と getRandNum_New() という 2 つの関数が作成されました。 :mt19937 と std::uniform_int_distribution をそれぞれ組み合わせて、0 から 5 までの乱数を生成します。各方法を使用して 960,000 個の乱数が生成され、各数値 (0 ~ 5) の頻度が記録されました。標準偏差が指標として機能し、値が低いほど分布がより均一であることを示します。このプロセスを 1000 回繰り返し、各反復にかかる時間を測定しました。
驚くべきことに、ロールの分布は両方の方法で同様でした。新しい方法は約 4 倍遅かった。速度の向上は品質の最小限の向上を犠牲にして実現されたように見えました。
しかし、決定的な違いは RNG 実装自体にあります。多くの rand() 実装では線形合同生成器 (LCG) が使用されていますが、これは一般に最も堅牢ではありません。蔓延しているにもかかわらず、これらは通常、実施されたような基本的なテストでは許容可能な結果を生成します。
標準以下の rand() 実装の欠点には、下位ビットのランダム性が低い、周期が短い、RAND_MAX が低い、連続するデータ間の相関が含まれます。抽出物。ただし、これらの制限は rand() API に固有のものではないことに注意することが重要です。
rand() の根本的な問題は次の点に集中します。
新しい
パフォーマンス面、std::mt19937 (テストで std::rand() によって使用) std::minstd_rand よりも遅い (LCG は<ランダム>ライブラリ)。 getRandNum_Old() と同様の実装で std::minstd_rand を使用すると、より高速な実行を実現できます (rand() の 8.61 ミリ秒と比較して 6 ミリ秒)。
以上がC の `` ライブラリが `rand()` よりも好まれるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。