首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在gmp任意精度上生成正态分布

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

Stack Overflow用户
提问于 2012-06-11 23:00:14
回答 3查看 354关注 0票数 4

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

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

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

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

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

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

EN

回答 3

Stack Overflow用户

发布于 2012-06-11 23:26:32

如果你的库有一个ln,那么这个Marsaglia polar method就可以工作。

票数 1
EN

Stack Overflow用户

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

票数 1
EN

Stack Overflow用户

发布于 2012-07-03 21:18:31

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10982661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档