因此,我正在尝试使用gmp进行一些计算,在某些情况下,我需要从正态分布生成一个伪随机数(prn)。
由于gmp有一个统一的随机变量,这已经很有帮助了。然而,我发现很难选择我应该使用哪种方法从均匀分布生成正态分布。在实践中,我的问题是gmp只有简单的操作,例如我不能使用cos或erf求值,因为我必须自己实现所有的。
我的问题是,我可以在多大程度上从gmp上的正态分布生成prn,如果这非常困难,如果有任何已经实现正态分布的任意精度库。
作为两个不起作用的方法的示例(从this question检索):
Ziggurat algorithm使用f的计算,在这种情况下,f是一个非整数指数,因此不受gmp支持。
Box–Muller Transform使用cos和sin,gmp不支持它们。
发布于 2012-06-11 23:26:32
如果你的库有一个ln,那么这个Marsaglia polar method就可以工作。
发布于 2012-06-12 00:16:02
结合一个库,能够产生一个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-07-03 21:18:31
我最终使用了mpfr,它本质上是具有更多功能的gmp。它已经实现了一个正态分布。
https://stackoverflow.com/questions/10982661
复制相似问题