12

なぜ乱数ジェネレーターstd::uniform_real_distributionよりも優れているのですか?rand()誰かが例を挙げてもらえますか?

4

3 に答える 3

10

まず、提案された比較が無意味であることを明確にする必要があります。

uniform_real_distributionは乱数ジェネレーターではありません。uniform_real_distributionに渡す乱数ジェネレータがないと、から乱数を生成することはできませんoperator()uniform_real_distributionその乱数ジェネレーターの出力を均一な実分布に「整形」します。さまざまな種類の乱数ジェネレーターをディストリビューションにプラグインできます。

これで適切な比較ができるとは思わないので、代わりにuniform_real_distributionC++11乱数ジェネレーターを使用した場合と比較しますrand()

比較の有用性をさらに低下させるもう1つの明らかな違いは、整数を生成するuniform_real_distribution一方で、浮動小数点数を生成するために使用されるという事実です。rand()

とはいえ、新しい施設を好む理由はいくつかあります。

rand()はグローバル状態ですが、施設を使用する場合は<random>グローバル状態は関係しません。必要な数の発電機と配電を使用でき、それらはすべて互いに独立しています。

rand()生成されたシーケンスの品質に関する仕様はありません。C ++ 11の乱数ジェネレーターはすべて明確に指定されており、分布も明確に指定されています。rand()実装は非常に質が低く、実際には非常に均一ではない可能性があります。

rand()事前定義された範囲内の乱数を提供します。その範囲を目的の範囲に調整するのはプログラマーの責任です。これは簡単な作業ではありません。いいえ、%何かを使用するだけでは十分ではありません。このような素朴な方法でこの種の調整を行うと、元のシーケンスにあった均一性が破壊される可能性が高くなります。uniform_real_distributionこの範囲調整を正しく行います。

于 2012-11-21T11:02:14.320 に答える
9

実際の比較はrand、C++11標準ライブラリによって提供される乱数エンジンの1つとの間です。std::uniform_real_distributionいくつかのパラメーター(たとえば、10から20の間の実際の値)に従ってエンジンの出力を分配するだけです。rand舞台裏で使用するエンジンを作成することもできます。

現在、標準ライブラリの乱数エンジンとプレーンオールドを使用することの違いrandは、保証と柔軟性にあります。rand乱数の品質を保証するものではありません。実際、多くの実装には、分布と期間に欠点があります。高品質の乱数が必要な場合は、randそれはできません。ただし、乱数エンジンの品質は、それらのアルゴリズムによって定義されます。を使用するstd::mt19937と、この徹底的にテストおよび分析されたアルゴリズムから何が得られるかが正確にわかります。エンジンが異なれば、好みの品質(スペース効率、時間効率など)も異なり、すべて構成可能です。

これは、randあまり気にしないときに使用する必要があるということではありません。すぐにC++11の乱数生成機能を使い始めた方がよいでしょう。マイナス面はありません。

于 2012-11-21T11:04:22.023 に答える
4

その理由は、実際には関数の名前にあります。これは、提供するstd::uniform_real_distribution乱数の均一な分布と比較して、乱数の分布の均一性が優れているという事実ですrand()

の分布std::uniform_real_distributionはもちろん、与えられた区間[a、b)の間です。

つまり、1から10までの乱数を要求したときに、5を取得したり、9を取得したり、その他の可能な値を取得したりする場合と同じように、それを呼び出して呼び出す場合と同じように、確率密度が大きくなるということです。数回、9ではなく5を取得する確率が異なる場合があります。std::uniform_real_distributionrand()

于 2012-11-21T10:52:05.423 に答える