В стандарте C ++ мы можем прочитать о std::discrete_distribution
в 26.6.8.6.1 [rand.dist.samp.discrete] (выделено мной)
A discrete_distribution
распределение случайных чисел производит случайные целые числа i, 0 ≤ i , распределенные согласно дискретной функции вероятности P ( i | p 0 ,…, p n − 1 ) = p i .
Если не указано иное, параметры распределения рассчитываются как: p k = w k / S для k = 0,…, n − 1, , в котором значения w k , обычно известные как веса , должен быть неотрицательным, не-NaN и не бесконечным . Более того, должно выполняться следующее соотношение: 0 0 + ⋯ + w n − 1 .
Some весов, используемых запрашивающим (например, 1.29272e + 308), настолько велики, что их сумма выходит за пределы диапазона double
, так что значение S (которое становится бесконечным), и следующие вычисления становятся бессмысленно.
Я протестировал поведение g cc, clang и MSV C в таком угловом случае и обнаружил, что в то время как g cc и clang производят распределение со всеми вероятностями, равными нулю и std::discrete_distribution::operator()
всегда возвращает n - 1 , MSV C также производит распределение со всеми вероятностями, равными нулю, но возвращаемое целое число всегда n ( значение вне пределов, как испытал спрашивающий).
По моей интерпретации, это не стандартное совместимое поведение, даже если, к их чести, входные параметры OP приводят к нарушению предварительных условий.