4

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

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

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

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

Ziggurat 算法使用 f 的评估,在这种情况下是非整数指数,因此 gmp 不支持。

Box–Muller 变换使用 gmp 不支持的 cos 和 sin。

4

3 回答 3

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

于 2012-06-11T16:16:02.120 回答
1

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

于 2012-07-03T13:18:30.633 回答
1

如果您的图书馆ln.

于 2012-06-11T15:26:32.037 回答