it-roy-ru.com

C # Normal Случайное число

Я хотел бы создать функцию, которая принимает Double mean, Double deviation и возвращает случайное число с нормальным распределением. 

Пример: если я передам 5.00 как среднее значение и 2.00 как отклонение, в 68% случаев я получу число от 3.00 до 7.00

Моя статистика немного слабая ... У кого-нибудь есть идеи, как мне к этому подойти? Моя реализация будет C # 2.0, но не стесняйтесь отвечать на выбранном вами языке, если математические функции стандартны.

Я думаю это может быть на самом деле то, что я ищу. Любая помощь в преобразовании этого в код?

Заранее спасибо за помощь.

23
J.Hendrix

Смотрите эту статью CodeProject: Генерация простых случайных чисел . Код очень короткий и генерирует выборки из равномерного, нормального и экспоненциального распределений.

21
John D. Cook

Возможно, вас заинтересует Math.NET , в частности пакет Numerics.

Caveat: пакет чисел предназначен для .NET 3.5. Вам может понадобиться использовать пакет Iridium, если вы ориентируетесь на более раннюю версию ...

12
Jason Punyon

Вот некоторый C, который возвращает два значения (Rand1 и Rand2) только потому, что алгоритм эффективно это делает. Это полярная форма преобразования Бокса-Мюллера .

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

из второго топ ответа

    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;

    }

Преобразование Бокса-Мюллера

сверху ответ по ссылке (в два раза быстрее?)

от 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