随机库 1.10
 全部 课程 命名空间 文件夹 功能 变量 类型定义 枚举器 朋友  
MPFR接口
返回到其他随机分布。转发至保存和恢复状态。最多目录.

注:的改编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)
40.3010
80.307.7
160.307
240.0560.210.306.4
320.338.6
480.358.5
530.0790.290.358.5
640.0690.300.358.4
1280.3713
2560.4123
10240.6482
40961.5520
163844.95200
655361953000
26214481490000
10485763004100000

指数分布抽样方法的关键:
(1)指数分布
(2)精确指数,使用= 32;
(3)MPF指数,使用=32,使用与精确指数
(4)MPF指数L,它使用与相同的算法指数分布(取均匀偏差的对数)。

此表给出了从正态分布生成随机样本所需的时间:

正态分布抽样次数(us)
预充电(1)(2)(3)(3')(4)(4')
40.911.20.622.7
80.911.20.612.4
160.911.20.612.6
240.0340.540.911.20.652.8
320.951.20.923
480.961.30.923.1
530.0470.610.961.30.933.2
640.0430.640.971.313.4
1280.991.31.24.8
25611.31.57.7
10241.31.53.726
40962.12.418160
163845.45.71501600
655361919130015000
262144777611000140000
1048576300300870001000000

正态分布抽样方法的关键:
(1)常态分配
(2)完全正常,使用= 32;
(3)MPFR-正常,使用=32,使用与完全正常
(3')MPFRNormalK标准,使用=32,使用Kahn算法;
(4)MPFR标准,它使用与相同的算法常态分配(比率法);
(4')MPFR的grandom,使用极性方法。

笔记:

冯·诺依曼方法分为两个阶段。(1) 使用一些均匀的随机数来形成随机样本的初始数字。(2) 附加数字直接从随机数生成器复制到随机样本。在阶段(1)和MPFR随机类持有这个中间对象。的效用MPFR随机通过考虑Kahn的正常采样算法可以看出:pickz(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-正常:

/**
*\文件MPFRExample.cpp
*\brief调用RandomLib::MPFRNormal的示例。
*
*编译、链接和运行,例如。,
*g++-I../include-O2-o MPFRExample MPFRExmple.cpp-lmpfr-lgmp
* ./MPF示例
*
*版权所有(c)Charles Karney(2012)<charles@karney网站>并根据
*MIT/X11许可证。有关更多信息,请参阅
* http://randomlib.sourceforge.net/
**********************************************************************/
#包括<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”
RandomLib::MPFR正常<>规范;//默认情况下,位=32
对于(整数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”
随机库::MPFRNormal<1>规范;//选择位=1,以便范围
对于(整数k=0;k<10++k){
范数(x,r);//获取MPFRRandom范围
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...
返回到其他随机分布。转发至保存和恢复状态。最多目录.