0

1〜10の範囲の乱数を生成したい。要件は、数値の70%が1〜3の範囲で生成され、残りの30%が4〜10の範囲で生成されることです。ブーストを使用して確率分布を生成しています。どのprobdistを使用する必要があり、どのパラメーターを使用する必要がありますか?

4

1 に答える 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 に答える