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

generating a normal distribution on gmp arbitrary precision

本文关键字:正态分布 精度 gmp 任意      更新时间:2023-10-16

因此,我尝试使用 gmp 进行一些计算,并且在某些时候我需要从正态分布生成伪随机数 (prn)。

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

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

作为两个不起作用的方法示例(从此问题中检索):

Ziggurat 算法使用 f 的求值,在本例中为 f 是非整数指数,因此不受 gmp 支持。

Box-Muller 变换使用 cos 和 sin,gmp 不支持这些内容。

如果您的库有ln,则 Marsaglia 极性方法将起作用。

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

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