Примером, который Вы даете, является на самом деле Python встроенная функция, вызванная divmod
. Таким образом, кто-то, в какой-то момент вовремя, думал, что это был pythonic достаточно для включения в базовую функциональность.
мне, если это делает инструмент для очистки кода, это - pythonic. Сравните эти два блока кода:
seconds = 1234
minutes, seconds = divmod(seconds, 60)
hours, minutes = divmod(minutes, 60)
seconds = 1234
minutes = seconds / 60
seconds = seconds % 60
hours = minutes / 60
minutes = minutes % 60
Если вы готовы платить, посмотрите на NMath от Centerspace.
В противном случае, код C, используемый программой Stats R, здесь , и его можно легко перенести на C #.
РЕДАКТИРОВАТЬ: Подробности ( inc.) о создании метода для этого на стр. 178 Практические численные методы с C # Джека Сюя.
ДРУГОЕ ИЗМЕНЕНИЕ:
Нет очевидного способа сделать это эффективно. Для малых n вы можете просто использовать формулу для вычисления обратной PDF. Для больших n вам, вероятно, лучше всего использовать одно из приближений к другим распределениям , которые легче вычислить.
Другой вариант - взять образец из Нормального или Пуассоновского, как вы, и затем добавить шаг Метрополис-Гастингс , чтобы принять или отклонить ваш образец. Если вы соглашаетесь, что все готово, если вы отказываетесь, вам придется снова полностью пересэмплировать. Я предполагаю, что поскольку приближение настолько близко, вы почти всегда получите шаг принятия, время от времени вы можете отклонить.
Также Книга Люка Девроя содержит несколько отличных алгоритмов для биномиальной выборки. 1250] PS Если получится хороший алгоритм; не могли бы вы поделиться им на Math.Net Numerics ?