ホームページ >バックエンド開発 >C++ >C の `` ライブラリが `rand()` よりも好まれるのはなぜですか?

C の `` ライブラリが `rand()` よりも好まれるのはなぜですか?

DDD
DDDオリジナル
2024-11-03 17:00:03188ブラウズ

Why is the `` library in C   preferred over `rand()`?

新しいランダム ライブラリは 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() の根本的な問題は次の点に集中します。

  1. 下位互換性: 既存の実装を変更すると、修正された srand に依存するプログラムの再現性が失われます。 seed.
  2. 単純化されたインターフェイス: rand() は単一のグローバル ジェネレーターを提供します。基本的な使用例には適していますが、マルチスレッドのアプリケーションや、再現可能なシーケンスが必要なシナリオでは課題が生じます。

新しい ライブラリは、以下を提供することでこれらの問題に対処します:

  • 指定された実装: クロスコンパイラーで再現可能な出力と保証された特性。
  • 最先端ジェネレーター: グローバル状態を回避するためにクラスにカプセル化されています。問題。
  • ランダム デバイス: シード機能。

パフォーマンス面、std::mt19937 (テストで std::rand() によって使用) std::minstd_rand よりも遅い (LCG は<ランダム>ライブラリ)。 getRandNum_Old() と同様の実装で std::minstd_rand を使用すると、より高速な実行を実現できます (rand() の 8.61 ミリ秒と比較して 6 ミリ秒)。

以上がC の `` ライブラリが `rand()` よりも好まれるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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