在gmp任意精度上生成正态分布

时间:2012-06-11 15:00:14

标签: c++ c algorithm random gmp

所以,我正在尝试将gmp用于我正在进行的一些计算,并且在某些时候我需要从正态分布中生成伪随机数(prn)。

由于gmp具有统一的随机变量,因此已经有很多帮助。但是,我发现很难选择使用哪种方法从统一的方法生成正态分布。在实践中,我的问题是gmp只有简单的操作,所以例如我不能使用cos或erf评估,因为我必须通过miself来实现所有。

我的问题是我可以在多大程度上从gmp上的正态分布生成prn,如果非常困难,是否有任何精度lib已经实现了正态分布。

作为两个不起作用的方法示例(从this question检索):

Ziggurat algorithm使用f的计算,在这种情况下,它是非整数指数,因此不受gmp支持。

Box–Muller Transform使用cos和sin,gmp不支持。

3 个答案:

答案 0 :(得分:1)

如果您的图书馆有ln,则Marsaglia polar method会有效。

答案 1 :(得分:1)

将能够为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等。然后,使用均匀随机生成器选择其中一个这些间隔再次使用均匀或线性分布计算所选区间内的随机数。

答案 2 :(得分:1)

我最终使用了mpfr,这本质上是gmp,具有更多功能。它已经实现了正常分发。