Нормализация десятичного значения - PullRequest
0 голосов
/ 08 апреля 2020

Моя проблема такова: мне нужно сгенерировать случайное число из распределения Гауссина / Нормы и создать гистограмму шириной 0,1.

class Gaussian
{
    public static double Next(Random r, double mu = 0, double sigma = 1)
    {
        var u1 = r.NextDouble();
        var u2 = r.NextDouble();

        var rand_std_normal =   Math.Sqrt(-2.0 * Math.Log(u1)) *
                                Math.Sin(2.0 * Math.PI * u2);

        var rand_normal = mu + sigma * rand_std_normal;

        return rand_normal;
    }
}

Я использую вышеупомянутую функцию для генерации гауссиана случайное значение.

Теперь, чтобы создать гистограмму, мне нужен такой расчет, который мог бы автоматически преобразовать гауссово значение в индекс массива. Что-то вроде следующего:

    static void Main(string[] args)
    {
        const int N = 1000;
        int time = N;
        const double binsDistance = 0.1;
        int binsCount = (int)(N * binsDistance);

        Random rand = new Random();
        int[] array = new int[binsCount];
        int side = 0;
        for (int i = 0; i < time; i++)
        {
            double gauss = Gaussian.Next(rand);
            int binNo = Normalization.Normalize(0, binsCount - 1, gauss);
            array[binNo]++;
        }
    }

Для этого я попробовал два расчета.

  1. первый здесь .
  2. второй здесь .

Проблема с первым состоит в том, что он не может правильно обрабатывать отрицательные числа.

Проблема со вторым , он генерирует слишком много нулевых значений.

Итак, у меня есть два вопроса:

  1. В чем заключается базовая c разница между # 1 и # 2?
  2. Как мне добиться того, что я пытаюсь сделать?
...