なぜ乱数ジェネレーターstd::uniform_real_distribution
よりも優れているのですか?rand()
誰かが例を挙げてもらえますか?
3 に答える
まず、提案された比較が無意味であることを明確にする必要があります。
uniform_real_distribution
は乱数ジェネレーターではありません。uniform_real_distribution
に渡す乱数ジェネレータがないと、から乱数を生成することはできませんoperator()
。uniform_real_distribution
その乱数ジェネレーターの出力を均一な実分布に「整形」します。さまざまな種類の乱数ジェネレーターをディストリビューションにプラグインできます。
これで適切な比較ができるとは思わないので、代わりにuniform_real_distribution
C++11乱数ジェネレーターを使用した場合と比較しますrand()
。
比較の有用性をさらに低下させるもう1つの明らかな違いは、整数を生成するuniform_real_distribution
一方で、浮動小数点数を生成するために使用されるという事実です。rand()
とはいえ、新しい施設を好む理由はいくつかあります。
rand()
はグローバル状態ですが、施設を使用する場合は<random>
グローバル状態は関係しません。必要な数の発電機と配電を使用でき、それらはすべて互いに独立しています。
rand()
生成されたシーケンスの品質に関する仕様はありません。C ++ 11の乱数ジェネレーターはすべて明確に指定されており、分布も明確に指定されています。rand()
実装は非常に質が低く、実際には非常に均一ではない可能性があります。
rand()
事前定義された範囲内の乱数を提供します。その範囲を目的の範囲に調整するのはプログラマーの責任です。これは簡単な作業ではありません。いいえ、%何かを使用するだけでは十分ではありません。このような素朴な方法でこの種の調整を行うと、元のシーケンスにあった均一性が破壊される可能性が高くなります。uniform_real_distribution
この範囲調整を正しく行います。
実際の比較はrand
、C++11標準ライブラリによって提供される乱数エンジンの1つとの間です。std::uniform_real_distribution
いくつかのパラメーター(たとえば、10から20の間の実際の値)に従ってエンジンの出力を分配するだけです。rand
舞台裏で使用するエンジンを作成することもできます。
現在、標準ライブラリの乱数エンジンとプレーンオールドを使用することの違いrand
は、保証と柔軟性にあります。rand
乱数の品質を保証するものではありません。実際、多くの実装には、分布と期間に欠点があります。高品質の乱数が必要な場合は、rand
それはできません。ただし、乱数エンジンの品質は、それらのアルゴリズムによって定義されます。を使用するstd::mt19937
と、この徹底的にテストおよび分析されたアルゴリズムから何が得られるかが正確にわかります。エンジンが異なれば、好みの品質(スペース効率、時間効率など)も異なり、すべて構成可能です。
これは、rand
あまり気にしないときに使用する必要があるということではありません。すぐにC++11の乱数生成機能を使い始めた方がよいでしょう。マイナス面はありません。
その理由は、実際には関数の名前にあります。これは、提供するstd::uniform_real_distribution
乱数の均一な分布と比較して、乱数の分布の均一性が優れているという事実ですrand()
。
の分布std::uniform_real_distribution
はもちろん、与えられた区間[a、b)の間です。
つまり、1から10までの乱数を要求したときに、5を取得したり、9を取得したり、その他の可能な値を取得したりする場合と同じように、それを呼び出して呼び出す場合と同じように、確率密度が大きくなるということです。数回、9ではなく5を取得する確率が異なる場合があります。std::uniform_real_distribution
rand()