Гарантируется ли `std :: normal_distribution` нормальное отклонение 0? - PullRequest
2 голосов
/ 08 февраля 2012

В реализации gcc это работает тривиально; параметры применяются только как простое умножение и сдвиг фактического вывода алгоритма . Но я мог бы представить, чтобы другие алгоритмы имели проблемы с особым случаем, подобным этому. Должен ли я лучше встроить внешнюю защиту, или можно просто дать конструктору std::normal_distribution значение 0 в качестве параметра стандартного отклонения, чтобы получить «неслучайное распределение», то есть то, которое всегда дает среднее значение?

(Производительность в стороне)

Ответы [ 3 ]

4 голосов
/ 08 февраля 2012

Стандарт гласит следующее (§26.5.8.4.4):

explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);
    Requires: 0 < stddev.

Как таковой стандартный вывод 0 явно запрещен стандартом и поэтому не гарантирует его работу.Поэтому создание внешней защиты кажется хорошей идеей

Даже если бы типичная реализация работала со стандартным производным 0 (не уверен, так ли это), я мог бы представить реализацию, которая проверяет такой случайи выдает исключение, когда стандартный вывод равен нулю, и выдает исключение, если это не так (для обеспечения переносимости кода).В качестве альтернативы возможно, что код будет где-то делиться на стандартный производный, что также было бы проблематично с производным 0.

3 голосов
/ 08 февраля 2012

Нельзя использовать стандартное отклонение 0. От стандарта, раздел 26.5.8.5.1:

explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);
Requires: 0 < stddev.

Использование значения 0 приведет к неопределенному поведению, поэтому вам нужно будет указать это значение в специальном случае.

2 голосов
/ 08 февраля 2012

Как указывали предыдущие авторы, поведение функции normal_distribution определено только для stddev> 0.

Я просто хотел бы добавить, что это имеет большой математический смысл: для stddev (width) = 0 нормальное распределение Гаусса становится дельта-функцией Дирака.

Дельта-функция Диракаопределяется как == 0 везде, кроме x == 0, где оно не определено.Однако каждый интеграл по дельта-функции, который включает в себя x == 0 в пределах своих границ интегрирования, определяется как 1, а интеграл, не включающий x == 0, равен 0.

Это поведение не может быть правильно представлено вопределение чисел с плавающей запятой / двойных чисел, поэтому нормальное распределение с stddev = 0 должно оставаться неопределенным.

...