3

指定された平均と標準を持つ整数のセットを生成する方法を探しています。偏差。

ランダムライブラリを使用すると、ガウス形式で分散されたランダムなdoubleのセットを生成できます。これは次のようになります。

#include <tr1/random>

std::tr1::normal_distribution<double> normal(mean, stdDev);
std::tr1::ranlux64_base_01 eng;
eng.seed(1000);
for (int i = 0; i < N; i++)
{
    gaussiannums[i] = normal(eng);
}

ただし、私のアプリケーションでは、doubleではなく整数が必要です。だから私の質問は、どのように上記と同等のものを生成しますが、doubleの代わりに整数を生成しますか?考えられる方法の1つは、何らかの方法でdoubleを整数に変換することですが、ベルの形状と平均/標準を実際に保持する方法でこれを実行できるかどうかを知るために、ランダムライブラリがどのように機能するかについては十分にわかりません。 。偏差。

ここでの目標は、特定のサイズの整数のセットを正しい平均と標準で取得することであるため、それほどランダムではないことを述べておく必要があります。偏差。

理想的には、生成できる最小値と最大値も指定したいのですが、doubleの場合でもこれを行う方法が見つからないため、これに関する提案も歓迎します。

4

1 に答える 1

7

これは不可能です。

ガウス分布は連続的で、整数のセットは離散的です。

ガウス pdf は無制限にサポートされます。最小値と最大値を指定すると、分布も異なります。

あなたは本当に何をしようとしていますか?重要なのは平均値と標準偏差だけですか?他の分布には、明確に定義された平均値と標準偏差があり、いくつかの離散分布が含まれます。


たとえば、二項分布を使用できます。

平均と分散の方程式を同時に解いて、pnを取得します。次に、この分布からサンプルを生成します。

nが整数にならない場合は、代わりに多項分布を使用できます。


ウィキペディアには、二項分布または多項分布からサンプリングする方法が記載されていますが、特に効率的ではありません。ここで使用できる任意の離散分布からサンプルを効率的に生成する方法があります。

コメントでは、特定の平均と標準偏差、および有界サポートを備えた釣鐘型の分布が必要であることを明確にしました。したがって、ガウス分布を出発点として使用します。

  • 関心のある整数の範囲全体でガウスCDFを計算します
  • テールの欠落を考慮して、わずかにオフセットしてスケーリングします(したがって、0から1まで変化します)
  • 配列に格納します

この分布からサンプリングするには:

  • [0:1] の範囲で一様実数を生成する
  • 二分探索を使用して CDF を逆変換する

切り捨てステップにより標準偏差がわずかに減少するため (最小値と最大値が選択した平均値から等距離でない場合は、平均値にも影響します)、事前にガウス パラメーターを微調整する必要がある場合があります。

于 2011-07-16T16:43:44.423 に答える