在 gmp 任意精度上生成正态分布
generating a normal distribution on gmp arbitrary precision
因此,我尝试使用 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。它已经实现了正态分布。
- 改变或缩放两个正态分布以具有特定的相关系数
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- 逆生存函数与正态分布的PPF(ICDF)?
- C 中高斯的随机正态分布
- C :实用程序名称空间中的正态分布
- MT19937和正态分布
- 生成C++中的正态分布随机数
- 如何从限于一定间隔的正态分布进行采样,即C 实现
- 带参数的累积正态分布函数的逆
- 在.h文件中声明正态分布生成器
- Box Muller Transform在实现正态分布PRNG时的问题
- 接受拒绝算法 C++ 正态分布
- 在C 中实现正态分布的统一比率
- 如何创建一个在单独的方法中工作的c++随机正态分布
- 如何在C++中随机采样具有给定平均值和标准误差的正态分布
- C++中对数正态分布的累积函数的逆
- C++生成范围内服从正态分布的随机数
- 在 gmp 任意精度上生成正态分布
- 如何计算 CDF C++中正态分布概率
- 随机数的正态分布会挂起程序