генерация нормального распределения с произвольной точностью gmp

Итак, я пытаюсь использовать gmp для некоторых вычислений, которые я делаю, и в какой-то момент мне нужно сгенерировать псевдослучайное число (prn) из нормального распределения.

Так как gmp имеет универсальную случайную переменную, это уже очень помогает. Однако мне трудно выбрать, какой метод я должен использовать для создания нормального распределения из равномерного. На практике моя проблема заключается в том, что gmp имеет только простые операции, и поэтому, например, я не могу использовать оценки cos или erf, так как мне пришлось бы реализовать все самому.

Мой вопрос заключается в том, в какой степени я могу сгенерировать prn из нормального распределения на gmp, и, если это очень сложно, если есть какая-либо библиотека произвольной точности, в которой уже реализовано нормальное распределение.

В качестве двух примеров методов, которые не работают (получено из этот вопрос):

Алгоритм Зиккурата использует оценку f, которая в данном случае является нецелочисленной экспоненциальной и, следовательно, не поддерживается gmp.

Преобразование Box–Muller использует cos и sin, которые не поддерживаются gmp.


person Jorge Leitao    schedule 11.06.2012    source источник
comment
Связанный вопрос: stackoverflow .com/questions/75677/   -  person gcbenison    schedule 11.06.2012
comment
Я отредактировал свой вопрос с дополнительной информацией об этом вопросе. Я видел его раньше, теперь я добавил ссылку на него.   -  person Jorge Leitao    schedule 11.06.2012
comment
gmp поддерживает целые, рациональные и числа с плавающей запятой. Что вы используете?   -  person salva    schedule 11.06.2012
comment
извините, я забыл, числа с плавающей запятой. Никогда не слышал о рациональных числах, распределенных по Гауссу, но это правильный вопрос! хD   -  person Jorge Leitao    schedule 11.06.2012
comment
и даже целые числа, если ваши параметры μ и σ достаточно велики!   -  person salva    schedule 11.06.2012


Ответы (3)


полярный метод Marsaglia будет работать, если в вашей библиотеке есть ln.

person Thom Smith    schedule 11.06.2012
comment
И квадратный корень, не забудьте. Хотя я полагаю, что можно было бы реализовать Ньютона-Рафсона для аппроксимации квадратного корня, если это необходимо. - person Managu; 03.07.2012

Объедините библиотеку, способную генерировать случайные числа для распределения N (0,1) как двойники, с равномерным генератором GMP.

Например, предположим, что ваш обычный генератор выдал 0x8.F67E33Ap-1.

Вероятно, только некоторые из этих цифр действительно случайны, поэтому усеките число до фиксированного числа двоичных цифр (т.е. усеките до 16 бит, 0x8.F67E33Ap-1 => 0x8.F67p-1) и сгенерируйте число равномерно в диапазоне [0x8.F67p-1, 0x8.F68p-1)

Для лучшего приближения вместо использования равномерного распределения вы можете вычислить значения функции плотности в экстремумах интервала (здесь достаточно двойной точности) и сгенерировать случайное число с распределением, связанным с трапецией, определяемой этими двумя ценности.

Другой способ решить эту проблему — просто сгенерировать таблицу значений 1000, 10000 или 100000 mpf, где N(x) становится равным 1/n, 2/n и т. д., а затем использовать равномерный генератор случайных чисел для выбора одного из этих интервалов и снова вычислите случайное число внутри выбранного интервала, используя равномерное или линейное распределение.

person salva    schedule 11.06.2012
comment
это не решение этой проблемы, но, тем не менее, является хорошим приближением. благодаря. - person Jorge Leitao; 15.06.2012

В итоге я использовал mpfr, который по сути является gmp с некоторыми дополнительными функциями. В нем уже реализовано нормальное распределение.

person Jorge Leitao    schedule 03.07.2012