1〜10の範囲の乱数を生成したい。要件は、数値の70%が1〜3の範囲で生成され、残りの30%が4〜10の範囲で生成されることです。ブーストを使用して確率分布を生成しています。どのprobdistを使用する必要があり、どのパラメーターを使用する必要がありますか?
1 に答える
2
Boostのドキュメントで見つけたコードを調整すると、これらの行に沿った何かが問題を解決するはずだと思います。
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/discrete_distribution.hpp>
int main() {
double probabilities[] = {
0.7/3, 0.7/3, 0.7/3, 0.3/7, 0.3/7, 0.3/7, 0.3/7, 0.3/7, 0.3/7, 0.3/7
};
boost::random::discrete_distribution<> dist(probabilities);
/* For each number to generate: */
int number = dist(gen) + 1; // to get range 1-10 rather than 0-9
return 0;
}
厳密に言えば、これは70%の確率を1〜3の数字に割り当て(確率質量の70%は1、2、3に均等に分散されます)、30%は4〜10に割り当てます(これも均等に分散されます)。その中で)。これは、取得する数値の70%が1〜3であり、30%が4〜10であることを保証するものではありません。これは、出力が大きくなるにつれて、その分布に収束する可能性が高いことを意味します。
数値の正確に70%が1〜3であり、30%が4〜6であることを実際に保証したい場合は、2つの一様分布を定義する必要があります。
boost::random::uniform_int_distribution<> dist1(1, 3);
boost::random::uniform_int_distribution<> dist2(4, 10);
次に、N個の乱数を生成するために、N*0.7
から時間を描画しdist1
、からN*0.3
時間を描画dist2
し、これらの数値をすべてaに入れて、std::vector
を適用できますstd::random_shuffle()
。これにより、70:30の要件が保証されます(Nに応じて発生する可能性のある丸め誤差を除く)。
于 2012-08-22T05:15:24.380 に答える