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

Я пытаюсь использовать повышение:: normal_distribution для генерации нормального распределения со средним 0 и сигмой 1.

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

#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.

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

Править: Это - то, что происходит, когда Вы имеете крайние сроки и стараетесь не изучать теорию прежде, чем сделать практику.

24
задан davidag 18 February 2011 в 09:55
поделиться

2 ответа

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

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

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

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

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

alt text

1 : из документации по повышению :

:

normal_distribution (realtype означает = 0, realtype sd = 1);

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

30
ответ дан 28 November 2019 в 23:45
поделиться

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

8
ответ дан 28 November 2019 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: