Кажется, проблема в математике с плавающей точкой. В частности, кажется вероятным, что распределение сохраняет промежуточный итог при нормализации его весов, что приводит к потере крошечной вероятности в конце. В простом примере предположим, что double может хранить только 2 значащие цифры (реальность ближе к 16), а ваши веса были 0,001, 1,0, 1,0 и 0,001:
Он суммирует весовые коэффициенты до 2,002 (которые он может представлять только как 2,00), а затем идет вперед и нормализует весовые коэффициенты. Первый становится 0,001 / 2,00 = 0,0005. Затем следующий равен 0,5, итоговое значение 0,5005 (то есть 5,00). Третий вес тоже 0,5, итого уже 1,00. Разница с допустимой суммой составляет 0,00, поэтому она не может дать положительный вес последнему событию.
Я знаю, что это не идеальный пример (потому что веса все еще не суммируются полностью), но я надеюсь, что вы поняли - ваша стандартная реализация библиотеки и / или ваши настройки с плавающей точкой портят ваши результаты здесь из-за отмены. Не то чтобы ваше событие с вероятностью 1e-20 когда-либо происходило в пределах разумного, но вы правы в том, что теоретически оно должно сохранять симметрию.
Для тех, кто говорит, что «его недостаточно для печати»: я не согласен, потому что в идеале значения должны быть симметричными, а первое значение не печатается как 0, в отличие от последнего. Видя, что только те значения, которые меньше, чем один ULP около 1, печатаются как ноль, я поддерживаю отмену как проблему.