平均と分散を指定すると、ガウスランダム値を返すC ++関数を記述しようとしています。
とのrand()
間の乱数を返すライブラリ関数があります。には固定値はありませんが、少なくともになることが保証されています。そのPDFは均一です。0
RAND_MAX
RAND_MAX
これrand()
をガウス変数に変換するために、中心極限定理を使用しています。私が正確にやっていることは、rand()
ユーザーが指定した時間を呼び出し、それらの戻り値を合計して、その平均をユーザー指定の平均にシフトすることです。
上記のプロットでは、ガウスランダムジェネレーターを回呼び出し、戻り値の頻度をプロットしました。ご覧のとおり、他の多くのランダムな値の合計によって作成されるため、その分散は非常に大きくなります。
これは、ガウスPDFと指定された平均値を持つガウス変数を正常に返します。ただし、問題はその分散です。分散をユーザー指定の値に変更する方法がわからないので、この時点で立ち往生しています。
これは私のコードです(現時点では不完全です。パラメータ「Variance」は無視されます):
template <class T>
T Random::GetGaussian(T Mean /*= 0*/, T Variance /*= 1*/)
{
T MeanOfSum = NUM_GAUSSIAN_SUMS / static_cast<T>(2);
T Rand = 0;
for (uint64_t i=0; i<NUM_GAUSSIAN_SUMS; i++)
{
Rand += static_cast<T>(rand()) / RAND_MAX;
}
return Rand - (MeanOfSum - Mean);
}
それNUM_GAUSSIAN_SUMS
が100で、RAND_MAX
32767 であると仮定します。
関数のパラメータに応じて確率変数の分散を変えたい。私の質問は、この確率変数の分散を変更するにはどうすればよいですか?どうすればできますか?