web-dev-qa-db-ja.com

C#正規乱数

Double meanDouble deviationを受け入れ、正規分布の乱数を返す関数を作成したいと思います。

例:平均として5.00、偏差として2.00を渡すと、68%の確率で3.00から7.00の間の数値が得られます。

私の統計は少し弱いです…。誰かが私がこれにどのようにアプローチすべきか考えていますか?私の実装はC#2.0になりますが、数学関数が標準である限り、選択した言語で自由に答えてください。

this は実際に私が探しているものかもしれないと思います。これをコードに変換するのに何か助けはありますか?

よろしくお願いします。

24
J.Hendrix

このCodeProjectの記事を参照してください: 単純な乱数生成 。コードは非常に短く、一様分布、正規分布、指数分布からサンプルを生成します。

21
John D. Cook

Math.NET 、特にNumericsパッケージに興味があるかもしれません。

警告:数値パッケージは.NET3.5を対象としています。以前のバージョンをターゲットにしている場合は、Iridiumパッケージを使用する必要があるかもしれません...

12
Jason Punyon

これは、アルゴリズムが効率的に返すという理由だけで、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;

}

7
Ian W

このライブラリもかなり良いです:

。NET乱数ジェネレーターとディストリビューション

5
redcalx

申し訳ありませんが、コードはありませんが、 ウィキペディアのいくつかのアルゴリズム を指摘できます。選択するアルゴリズムは、必要な精度と必要な速度によって異なります。

2
Martin Sherburn

この質問を参照している人にとって、簡単な解決策は次のとおりです。

Random Rand = new Random();
double normRand  = alglib.invnormaldistribution(Rand.NextDouble())

必要に応じて、ミューとシグマでスケーリングします。
alglibライブラリは www.alglib.net で入手できます。

1
Ace

MetaNumerics ライブラリ(これも.NET)は、正規分布(および統計からのその他のほとんどすべて)を超高速で計算します。詳細については、機能のページをご覧ください。 Codeplexページはここにあります: http://metanumerics.codeplex.com/

0
Justin R.

MathNet

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;
    }
0
Declan Taylor