Следующий код не работает, так как некоторые значения превышают -1 и 1 (и не должны быть). Не могли бы вы указать, что я делаю неправильно?
Нет, это неправильное понимание стандартного отклонения (второй параметр в конструкторе 1 ) нормального распределения.
Нормальное распределение - это знакомая кривая колокола. Эта кривая эффективно говорит вам распределение значений. Значения, близкие к тому, где пики кривой колокола более вероятны, чем значения далеко (хвост распределения).
Стандартное отклонение показывает, насколько разбросаны значения. Чем меньше число, тем более концентрированные значения находятся около среднего значения. Чем больше число, тем менее сконцентрированные значения находятся около среднего значения. На изображении ниже вы видите, что красная кривая имеет дисперсию (дисперсия является квадратом стандартного отклонения) 0,2. Сравните это с зеленой кривой, которая имеет то же среднее значение, но дисперсию 1,0. Вы можете видеть, что значения в зеленой кривой более разбросаны по отношению к красной кривой. Фиолетовая кривая имеет дисперсию 5,0, а значения еще более разбросаны.
Итак, это объясняет, почему значения не ограничиваются [-1, 1]
. Однако интересно, что 68% значений всегда находятся в пределах одного стандартного отклонения от среднего. Итак, в качестве интересного теста для себя напишите программу, которая выводит большое количество значений из нормального распределения со средним 0 и дисперсией 1 и подсчитывает число, которое находится в пределах одного стандартного отклонения от среднего. Вы должны получить число, близкое к 68% (68.2689492137%, чтобы быть немного более точным).
1 : из буста документация :
normal_distribution(RealType mean = 0, RealType sd = 1);
Создает нормальное распределение со средним средним и стандартным отклонением sd.