Double mean
、Double deviation
を受け入れ、正規分布の乱数を返す関数を作成したいと思います。
例:平均として5.00、偏差として2.00を渡すと、68%の確率で3.00から7.00の間の数値が得られます。
私の統計は少し弱いです…。誰かが私がこれにどのようにアプローチすべきか考えていますか?私の実装はC#2.0になりますが、数学関数が標準である限り、選択した言語で自由に答えてください。
this は実際に私が探しているものかもしれないと思います。これをコードに変換するのに何か助けはありますか?
よろしくお願いします。
このCodeProjectの記事を参照してください: 単純な乱数生成 。コードは非常に短く、一様分布、正規分布、指数分布からサンプルを生成します。
Math.NET 、特にNumericsパッケージに興味があるかもしれません。
警告:数値パッケージは.NET3.5を対象としています。以前のバージョンをターゲットにしている場合は、Iridiumパッケージを使用する必要があるかもしれません...
これは、アルゴリズムが効率的に返すという理由だけで、2つの値(Rand1とRand2)を返すCです。 Box-Muller変換 の極形式です。
void RandVal (double mean1, double sigma1, double *Rand1, double mean2, double sigma2, double *Rand2)
{
double u1, u2, v1, v2, s, z1, z2;
do {
u1 = Random (0., 1.); // a uniform random number from 0 to 1
u2 = Random (0., 1.);
v1 = 2.*u1 - 1.;
v2 = 2.*u2 - 1.;
s = v1*v1 + v2*v2;
} while (s > 1. || s==0.);
z1 = sqrt (-2.*log(s)/s)*v1;
z2 = sqrt (-2.*log(s)/s)*v2;
*Rand1 = (z1*sigma1 + mean1);
*Rand2 = (z2*sigma2 + mean2);
return;
}
このライブラリもかなり良いです:
申し訳ありませんが、コードはありませんが、 ウィキペディアのいくつかのアルゴリズム を指摘できます。選択するアルゴリズムは、必要な精度と必要な速度によって異なります。
この質問を参照している人にとって、簡単な解決策は次のとおりです。
Random Rand = new Random();
double normRand = alglib.invnormaldistribution(Rand.NextDouble())
必要に応じて、ミューとシグマでスケーリングします。
alglibライブラリは www.alglib.net で入手できます。
MetaNumerics ライブラリ(これも.NET)は、正規分布(および統計からのその他のほとんどすべて)を超高速で計算します。詳細については、機能のページをご覧ください。 Codeplexページはここにあります: http://metanumerics.codeplex.com/ 。
2番目のトップアンサーから
public static double GenerateRandomVariant(double mean,double deviation,System.Random Rand=null, int factor=1)
{
Rand = Rand ?? new Random();
double randNormal=(MathNet.Numerics.Distributions.Normal.Sample(Rand, mean , deviation));
return factor * randNormal;
}
リンクを介してトップアンサーから(2倍速い?)
u/yoyoyoyosefによる ランダムガウス変数
public static double GenerateRandomVariant(double mean, double deviation, System.Random Rand=null, int factor = 1)
{
Rand = Rand ?? new Random();
double u1 = 1.0 - Rand.NextDouble(); //uniform(0,1] random doubles
double u2 = 1.0 - Rand.NextDouble();
double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) *
Math.Sin(2.0 * Math.PI * u2); //random normal(0,1)
double randNormal=(
mean + deviation * randStdNormal); //random normal(mean,stdDev^2)
return randNormal * factor;
}