返回到其他随机分布。转发至保存和恢复状态。最多目录.注:的改编MPF指数和MPFR-正常将作为功能包含在MPFR的下一个版本(3.1.2后)中mpfr_随机
和mpfr_nrandom(mpfr_n随机)
.
班级MPFR制服,MPF指数、和MPFR-正常,提供了计算随机偏差并以以下形式返回结果的有效方法最大功率因数数字。这些类(连同MPFR随机)是仅头的实现,不依赖于RandomLib的其余部分。为了使用这些标头,您可以将它们复制到开发MPFR应用程序的目录树中(确保它们位于名为RandomLib的目录中),并将其包含在例如。,
(RandomLib中包含3个附加类:MPF指数L,MPFRNormalK标准、和MPFR标准。但这些仅用于说明目的,因此标记为不赞成的在文档中。)
为了获得高精度MPFR制服,MPF指数、和MPFR-正常与精度成正比,其中比例常数由生成所需数量的随机位并将其复制到结果中来控制。因此,使用这些方法,在MPFR中生成随机数是最便宜的操作之一(例如,比乘法便宜)。定时数据如下表所示。
下表给出了从指数分布生成随机样本所需的时间:
指数分布抽样次数(us)
前c | (1) | (2) | (3) | (4) |
4 | | | 0.30 | 10 |
8 | | | 0.30 | 7.7 |
16 | | | 0.30 | 7 |
24 | 0.056 | 0.21 | 0.30 | 6.4 |
32 | | | 0.33 | 8.6 |
48 | | | 0.35 | 8.5 |
53 | 0.079 | 0.29 | 0.35 | 8.5 |
64 | 0.069 | 0.30 | 0.35 | 8.4 |
128 | | | 0.37 | 13 |
256 | | | 0.41 | 23 |
1024 | | | 0.64 | 82 |
4096 | | | 1.5 | 520 |
16384 | | | 4.9 | 5200 |
65536 | | | 19 | 53000 |
262144 | | | 81 | 490000 |
1048576 | | | 300 | 4100000 |
指数分布抽样方法的关键:
(1)指数分布;
(2)精确指数,使用位= 32;
(3)MPF指数,使用位=32,使用与精确指数;
(4)MPF指数L,它使用与相同的算法指数分布(取均匀偏差的对数)。
此表给出了从正态分布生成随机样本所需的时间:
正态分布抽样次数(us)
预充电 | (1) | (2) | (3) | (3') | (4) | (4') |
4 | | | 0.91 | 1.2 | 0.62 | 2.7 |
8 | | | 0.91 | 1.2 | 0.61 | 2.4 |
16 | | | 0.91 | 1.2 | 0.61 | 2.6 |
24 | 0.034 | 0.54 | 0.91 | 1.2 | 0.65 | 2.8 |
32 | | | 0.95 | 1.2 | 0.92 | 3 |
48 | | | 0.96 | 1.3 | 0.92 | 3.1 |
53 | 0.047 | 0.61 | 0.96 | 1.3 | 0.93 | 3.2 |
64 | 0.043 | 0.64 | 0.97 | 1.3 | 1 | 3.4 |
128 | | | 0.99 | 1.3 | 1.2 | 4.8 |
256 | | | 1 | 1.3 | 1.5 | 7.7 |
1024 | | | 1.3 | 1.5 | 3.7 | 26 |
4096 | | | 2.1 | 2.4 | 18 | 160 |
16384 | | | 5.4 | 5.7 | 150 | 1600 |
65536 | | | 19 | 19 | 1300 | 15000 |
262144 | | | 77 | 76 | 11000 | 140000 |
1048576 | | | 300 | 300 | 87000 | 1000000 |
正态分布抽样方法的关键:
(1)常态分配;
(2)完全正常,使用位= 32;
(3)MPFR-正常,使用位=32,使用与完全正常;
(3')MPFRNormalK标准,使用位=32,使用Kahn算法;
(4)MPFR标准,它使用与相同的算法常态分配(比率法);
(4')MPFR的grandom,使用极性方法。
笔记:
- 使用的定时测试随机库1.4,MPFR 3.1.0,g++4.6.1,基于64位Intel Xeon 2.66GHz,运行Linux Fedora Release 15。
- 方法(1)使用标准算法从这些分布中进行采样。这些数据相当准确,但确实如此不产生正确的四舍五入结果(在MPFR意义上)。
- 方法(2)采用冯·诺依曼方法的改进。这些可以提供正确的四舍五入结果。
- 方法(3)将方法(2)应用于MPFR。对于高精度,时间随精度线性缩放。方法(3'),使用MPF指数在内部,是使用Kahn算法从正态分布中采样的替代方法。Damien Stehlé建议我使用Kahn算法。为了获得高精度,这些方法的时间与精度成正比,并且它们都具有相同的比例常数。
- 方法(4)将方法(1)应用于MPFR。对于高精度,时间刻度约为精度的3/2次方。方法(4')使用grandom函数。
- MPF指数和MPFR-正常内部文件不足。请参阅精确指数和完全正常(实现相同的算法)以获取更多信息。
冯·诺依曼方法分为两个阶段。(1) 使用一些均匀的随机数来形成随机样本的初始数字。(2) 附加数字直接从随机数生成器复制到随机样本。在阶段(1)和MPFR随机类持有这个中间对象。的效用MPFR随机通过考虑Kahn的正常采样算法可以看出:pick年和z(z)从指数分布到(年− 1)2< 2z(z)然后返回年.如果年和z(z)返回为MPFR随机对象,则只需要生成足够的数字来确定验收测试。如果测试通过,则只需将数字添加到年(而不是z(z)). 自实施以来MPFRNormalK标准了解详细信息。MPFR制服是的薄包装MPFR随机其返回[0,1)中的样本。
班级MPFR随机,MPFR制服,MPF指数,MPFR-正常、和MPFRNormalK标准都采用模板参数位(默认值32),它给出了MPFR随机对象。这必须平均划分GMP_LIMB_BITS。为了便于移植,不应将其设置为64。通常32将提供最佳效率。较小的值有助于调试、研究算法复杂性(参见Knuth和Yao,1976),或者如果随机位很昂贵(例如,它们是由硬件生成器生成的)。
下面是一个使用MPFR-正常:
#包括<cstdio>
#包括<iostream>
#包括<ctime>
#如果是HAVE_MPFR
gmp_randstate t r;
gmp_randinit_mt(r);
time_t t0=标准::时间(0);
gmp_randseed_ui(r,t0);
mpfr_t z;
{
mpfr_prec_t预处理=240;mpfr_init2(z,prec);
标准::cout<<“精确单位正态分布样本”
<<前<<“\n”;
对于(整数k=0;k<10++k){
范数(z,r,MPFR_RNDN);
mpfr_out_str(标准输出,10,0,z,mpfr_RNDN);标准::cout<<“\n”;
}
}
{
mpfr_prec_t预处理=20;mpfr_set_prec(z,前c);
标准::cout<<“样本范围从正态分布的精度”
<<前<<“\n”;
对于(整数k=0;k<10++k){
范数(x,r);
x(z,MPFR_RNDD);
标准::cout<<"["<<mpfr_get_d(z,mpfr_RNDD)<<",";
x(z,MPFR_RNDU);
标准::cout<<mpfr_get_d(z,mpfr_RNDU)<<"] -> ";
x(z,r,MPFR_RNDN);
mpfr_out_str(标准输出,10,0,z,mpfr_RNDN);标准::cout<<“\n”;
}
}
mpfr_clear(z);mpfr_free_cache();gmp_randclear(r);
返回0;
#其他
标准::cerr<<“需要MPFR 3.0或更高版本才能运行MPFRExample\n”;
返回1;
#endif//HAVE_MPFR
}
该程序的典型输出为:
单位正态分布样本,精度240-5.6692556912807683301494494874784943926662835210924611284269456310097367350e-28.5362069032310026750031502283620341952982028910093176612208572465159728631e-1...样本范围为精度为20的正态分布[0,1]->7.2809029e-1[-2.25,-2.28125] -> -2.2580643...
返回到其他随机分布。转发至保存和恢复状态。最多目录.