ホームページ > バックエンド開発 > C++ > 新しいランダム ライブラリは本当に「std::rand()」よりも優れているのでしょうか?

新しいランダム ライブラリは本当に「std::rand()」よりも優れているのでしょうか?

Susan Sarandon
リリース: 2024-10-31 07:03:30
オリジナル
539 人が閲覧しました

Is the New Random Library Really Better Than `std::rand()`?

なぜ新しいランダム ライブラリは std::rand() より優れているのですか?

有名な講演「rand() は有害であると考えられています」では、エンジン ディストリビューションを使用しています。乱数生成のパラダイムは、古典的な std::rand() とモジュラスの単純化よりも提唱されています。

主張をテストするために、std::rand() と std::mt19937 と std:: を比較する実験を行ってください。 uniform_int_distribution が実施されました:

  1. 2 つの関数 getRandNum_Old と getRandNum_New が、2 つの方法を使用して 0 から 5 までの乱数を生成するために考案されました。
  2. 両方のアプローチを使用して 960,000 個の乱数が生成されました
  3. 周波数の標準偏差は 1000 回のシミュレーションで計算されました。
  4. 両方の方法にかかる時間も記録されました。

驚くべきことに、ロールの合計スプレッドは両方の方法で同等であり、std::mt19937 と std::uniform_int_distribution では追加の均一性が得られなかったことを示唆しています。ただし、新しい方法はおよそ 4 倍遅かったです。

この実験は std::rand() が必ずしも劣っているわけではないことを示しているように見えましたが、std::rand() に固有の制限を考慮することが重要です。

  • これは、線形合同生成器 (LCG) を使用します。これは、下位ビットのランダム性の低さ、周期の短さ、RAND_MAX の制限などの特定の弱点があることが知られています。
  • srand インターフェイスは、unsigned int を受け取るため、開始シード (および生成されるシーケンス) の数を制限します。

対照的に、新しい C 標準ライブラリのヘッダー:

  • 特性が保証された完全に指定されたアルゴリズムを提供します。
  • ジェネレーターをクラスにカプセル化し、グローバル状態と関連する問題を排除します。
  • シード用のデフォルトのrandom_device。
  • 必要に応じてカスタムジェネレータの実装が可能です。

パフォーマンスの観点から、std::minstd_randがstdの適切な代替となる可能性があることが示唆されています。 ::mt19937 LCG 品質が十分な場合、速度が向上する可能性があります (特に、uniform_int_distribution を使用した分散調整を回避する場合)。

最終的に、乱数ジェネレーターの選択はアプリケーションの特定の要件によって決まりますが、新しいこのライブラリには、特に高品質の乱数を必要とするアプリケーションに対して、従来の std::rand() 実装に比べていくつかの利点があります。

以上が新しいランダム ライブラリは本当に「std::rand()」よりも優れているのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート