Вопрос

Я пытаюсь использовать 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's 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.

Заранее благодарю вас всех!

Редактировать:Это то, что происходит, когда у вас есть крайние сроки и вы избегаете изучения теории перед практикой.

Это было полезно?

Решение

Следующий код не работает, поскольку некоторые значения превышают -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.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top