Подтвердить что ты не робот

Как использовать классы расширенного нормального распределения?

Я пытаюсь использовать boost:: normal_distribution, чтобы генерировать нормальное распределение со средним 0 и сигмой 1.

Следующий код не работает, так как некоторые значения превышают или превышают -1 и 1 (и не должны быть). Может ли кто-нибудь указать, что я делаю неправильно?

#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>

int main()
{
  boost::mt19937 rng; // I don't seed it on purpouse (it not relevant)

  boost::normal_distribution<> nd(0.0, 1.0);

  boost::variate_generator<boost::mt19937&, 
                           boost::normal_distribution<> > var_nor(rng, nd);

  int i = 0; for (; i < 10; ++i)
  {
    double d = var_nor();
    std::cout << d << std::endl;
  }
}

Результат на моей машине:

0.213436
-0.49558
1.57538
-1.0592
1.83927
1.88577
0.604675
-0.365983
-0.578264
-0.634376

Как вы можете видеть, все значения не находятся между -1 и 1.

Спасибо всем заблаговременно!

РЕДАКТИРОВАТЬ. Это то, что происходит, когда у вас есть крайние сроки и не следует изучать теорию, прежде чем делать практику.

4b9b3361

Ответ 1

Следующий код не работает, так как некоторые значения превышают или превышают -1 и 1 (и не должны быть). Может ли кто-нибудь указать, что я делаю неправильно?

Нет, это неправильное понимание стандартного отклонения (второго параметра в конструкторе 1) нормального распределения.

Нормальное распределение - это привычная кривая колокола. Эта кривая эффективно говорит вам о распределении значений. Значения, близкие к тому, где пики колоколообразной кривой более вероятны, чем значения далеко (хвост распределения).

Стандартное отклонение сообщает вам, как распределены значения. Чем меньше число, тем более концентрированные значения находятся вокруг среднего значения. Чем больше число, тем менее концентрированные значения находятся вокруг среднего значения. На изображении ниже вы видите, что красная кривая имеет дисперсию (дисперсия - квадрат стандартного отклонения) 0,2. Сравните это с зеленой кривой, которая имеет такое же среднее значение, но с разницей в 1,0. Вы можете видеть, что значения в зеленой кривой более распределены относительно красной кривой. Фиолетовая кривая имеет дисперсию 5.0, а значения еще более разбросаны.

Итак, это объясняет, почему значения не ограничиваются [-1, 1]. Интересно, однако, что 68% значений всегда находятся в пределах одного стандартного отклонения среднего значения. Итак, как интересный тест для себя, напишите программу, чтобы нарисовать большое количество значений из нормального распределения со средним 0 и дисперсией 1 и подсчитать число, которое находится в пределах одного стандартного отклонения среднего. Вы должны получить число, близкое к 68% (68.2689492137%, чтобы быть немного точнее).

alt text

1: От ускорения документация:

normal_distribution(RealType mean = 0, RealType sd = 1);

Создает нормальное распределение со средним средним и стандартным отклонением sd.

Ответ 2

Ты не делаешь ничего плохого. Для нормального распределения sigma определяет стандарт отклонение, а не диапазон. Если вы создадите достаточно образцов, вы увидите, что только о 68% из них лежат в диапазоне [среднее значение - сигма, среднее + сигма], около 95% в пределах 2 сигма, и более 99% в течение 3 сигм.