Передайте a==b в качестве параметров равномерному реальному распределению ok


Можно ли использовать std::uniform_real_distribution с a==b? Это условие можно интерпретировать как отсутствие случайности.

В библиотеке GNU c++:

explicit
param_type(_RealType __a = _RealType(0),
           _RealType __b = _RealType(1))
: _M_a(__a), _M_b(__b)
{
   _GLIBCXX_DEBUG_ASSERT(_M_a <= _M_b);
}

Утверждение принимает a==b, хотя оно может потребовать деления на ноль. Это

  • расширение стандарта?
  • умный дизайн, который все равно работает?
  • ошибка, которая случается при работе на определенных процессорах?
1 2

1 ответ:

Соответствующий нормативный пункт [26.5.8.2.2, ранд.расстояние.одно.real]/1 говорит:

A uniform_real_distribution распределение случайных чисел порождает случайные числа x, аx b , распределенные в соответствии с постоянной функцией плотности вероятности

p(x | a, b) = 1/(b − a) .

[Примечание : это означает, что p(x | a, b) не определено, когда a == b. - Конечная нота]

Обратите внимание, что a b является ограничением на распределение.

Интересно, что конструктор (пункт 2) имеет более слабое требование:

explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);

требуется : a ≤ b [...]

Это означает, что вы можете построить объект распределения с a == b, но распределение, которое он описывает, не определено. То есть вы не можете пытаться генерировать значения с таким объектом распределения, используя эти параметры (которые действительно могут потребовать деления на ноль или что-то еще).

См. также N3926 для мнения, почему эти два ограничения не являются несовместимыми. Этот вопрос первоначально был поднят какLWG 2168 и был решен путем добавления цитируемой заметки в первом абзаце. В статье обращается внимание на перегрузку operator(), которая принимает различные параметры распределения; в результате ограничения вступают в игру только при генерации значений, а не при построении объекта распределения.