Передайте 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 ответ:
Соответствующий нормативный пункт [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()
, которая принимает различные параметры распределения; в результате ограничения вступают в игру только при генерации значений, а не при построении объекта распределения.