Нормальное случайное число путем усреднения 5 равномерных выборок?

Глядя на устаревший код в нашем приложении, я нашел эту странную реализацию нормального ГСЧ. Я хочу обменять его на правильное преобразование Бокса-Мюллера, но мне нужна поддержка.

Как видите, он генерирует 5 случайных чисел от -3,875 до +3,875, а затем усредняет их, чтобы получить квазинормально распределенное значение от -1 до +1. Может ли это быть правильным? Как это вообще может работать? Почему 5 образцов?

Кто-нибудь, объясните это:

private double GetRandomNormalNumber()
    {
      const double SPREAD = 7.75;
      const double HALFSPREAD = 3.875;
      var random = new Random();

      var fRandomNormalNumber = ((random.NextDouble()*SPREAD - HALFSPREAD) +
                                 (random.NextDouble()*SPREAD - HALFSPREAD) +
                                 (random.NextDouble()*SPREAD - HALFSPREAD) +
                                 (random.NextDouble()*SPREAD - HALFSPREAD) +
                                 (random.NextDouble()*SPREAD - HALFSPREAD)
                                )/5;

      return fRandomNormalNumber;
    }

person zvolkov    schedule 12.03.2013    source источник


Ответы (2)


Аппроксимация нормального распределения путем усреднения нескольких случайных однородных выборок является стандартной и является следствием центральной предельной теоремы. . Обычно берут 12 проб. В вашем случае кто-то решил просто взять пять образцов, возможно, ради эффективности.

Взгляните на Генерировать случайные числа в соответствии с нормальным распределением в C/ С++

person anumi    schedule 12.03.2013
comment
Спасибо, ссылка на Центральную предельную теорему - это то, что я искал - person zvolkov; 12.03.2013
comment
Обратите внимание, что 12 чисел обычно берутся не совсем из-за CLT, а потому, что дисперсия одиночной однородной случайной величины от [0..1] составляет 1/12 (так как это E[x^2] - E[x]^2 = 1/3 - 1/4 = 1/12), поэтому сумма 12 таких чисел дает дисперсию, равную 1. Таким образом, если вы сложите 12 из них и вычтете 6, вы получите стандартный< /i> нормальная случайная величина со средним значением = 0 и дисперсией = 1. - person andreister; 12.01.2014

Код кажется правильным, он просто заставляет область около 0,0 иметь более высокую вероятность, чем края диапазона (-HALFSPREAD, HALFSPREAD).

Я сомневаюсь, что 5 цифр - это хорошо рассчитанное значение, скорее всего, оно было выбрано "потому что оно работает".

Если вы заменяете один ГСЧ другим, вы должны иметь возможность: пока замена имеет лучшие практические характеристики, никто не должен полагаться на конкретный результат существующего ГСЧ.

person Sten Petrov    schedule 12.03.2013