


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上 1. 线性同余随机数生成器介绍: 古老的LCG(linear congruential generator)代表了最好最朴素的伪随机数产生器算法。主要原因是容易理解,容易实现,而且速度快。 LCG 算法数学上基于公式: X(n+1) = (a * X(n) + c) % m 其中,各系数为: 模m, m > 0系数a, 0 < a < m增量c, 0
2、 <= c < m原始值(种子) 0 <= X(0) < m其中参数c, m, a比较敏感,或者说直接影响了伪随机数产生的质量。一般而言,高LCG的m是2的指数次幂(一般232或者264),因为这样取模操作截断最右的32或64位就可以了。多数编译器的库中使用了该理论实现其伪随机数发生器rand()。 下面是部分编译器使用的各个参数值: Sourcemacrand() / Random(L)的种子位Numerical Recipes232 Borland
3、 C/C+2321位30.16 in rand(), 30.0 in lrand()glibc (used by GCC)23212345位30.0ANSI C: Watcom, Digital Mars, CodeWarrior, IBM VisualAge C/C+23212345位30.16Borland Delphi, Virtual Pascal2321 位63.32 of (seed * L)Microsoft Visual/Quick C/C+ 232位30.16 Apple CarbonLib231-116807 0 见ParkMiller随机数发生器LCG不能用于随机数要求高
4、的场合,例如不能用于Monte Carlo模拟,不能用于加密应用。LCG有一些严重的缺陷,例如如果LCG用做N维空间的点坐标,这些点最多位于m1/n超平面上(Marsaglia定理),这是由于产生的相继X(n)值的关联所致。另外一个问题就是如果m设置为2的指数,产生的低位序列周期远远小于整体。一般而言,输出序列的基数b中最低n位,bk = m (k是某个整数),最大周期bn.有些场合LCG有很好的应用,例如内存很紧张的嵌入式中,电子游戏控制台用的小整数,使用高位可以胜任。 (2) C语言中伪随机数生成方法:rand(),srand(time(null)的
5、解析 C语言中伪随机数生成算法实际上是采用了"线性同余法"。具体的计算如下: Xi = (Xi-1 * A + C ) mod M 其中A,C,M都是常数(一般会取质数)。当C=0时,叫做乘同余法。引出一个概念叫seed,它会被作为X0被代入上式中,然后每次调用rand()函数都会用上一次产生的随机值来生成新的随机值。可以看出实际上用rand()函数生成的是一个递推的序列,一切值都来源于最初的 seed。所以当初始的seed取一样的时候,得到的序列都相同。 C语言里面有RAND_MAX这样一个宏,定义了rand()所能得到的随机值的范围。在C里可以看到RAND_MAX被定义
6、成0x7fff,也就是32767。rand()函数里递推式中M的值就是32767。 线性同余法生成的是伪随机数,粗略符合均匀分布。根据中心极限定理,任何分布的噪声,通过反复相加,就可以成为高斯噪声。 函数原型 1、C+标准函数库提供一随机数生成器rand,返回0RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试) 2、C+中另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随
7、机数列也相同。一个办法是让用户输入种子,但是仍然不理想。 3、 比较理想的是用变化的数,比如时间来作为随机数生成器的种子。time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。 / C+随机函数(VC program) #include <stdio.h> #include <iostream> #include <time.h> using namespace std; #define MAX 100 int main(int argc, char* argv) srand( (unsigned)time( NULL ) );/srand()
8、函数产生一个以当前时间开始的随机种子.应该放在for等循环语句前面 不然要很长时间等待 for (int i=0;i<10;i+) cout<<rand()%MAX<<endl;/MAX为最大值,其随机域为0MAX-1 return 0; rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。这样,如果你要产生010的10个整数,可以表达为: int N = rand() % 11; 这样,N的值就是一个010的随机数,如果要产生110,则是这样: int N = 1 + rand() % 11; 总结来说,可以表示为: a + rand() % n 其中的a是起始值,n是整数的范围。 a + rand() % (b-a+1) 就表示之间的一个随机数 若要01的小数,则可以先取得010的整数,然后均除以10即可得到随机到十分位的10个随机小数,若要得到随机到百分位的随机小数,则需要先得到0100的10个整数,然后均除以100,其它情况依此类推。 通常rand()产生的随机数在每次运行的时候都是与上一次相同的,这是有意这样设计的,是为了便于程序的调试。若要产生每次不同的随机数,可以使用srand( seed
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 音乐作品创作与发行权转让协议
- 2025年建筑工程法规更新解析试题及答案
- 现代管理学课程安排与内容试题及答案
- 突破难关的建筑工程试题及答案技巧
- 市政学考察的重要性试题及答案分析
- 2024年春九年级历史下册第五单元冷战和美苏对峙的世界5.19亚非拉国家的新发展课后提分训练新人教版
- 2025年行政公文写作考试版图试题及答案
- 2025版合同终止协议书:辞职与解除劳动合同的规范化流程
- 2025借款合同模板2
- 2025私人委托合同范本
- 国开2024年秋《心理健康教育》形考任务1-9答案
- 电力运维管理平台方案设计
- 安全培训管理体系
- 机场地震应急处理与疏散预案
- 南京工业大学《化工废水处理》2022-2023学年第一学期期末试卷
- 《阻燃材料与技术》课件 颜龙 第3、4讲 阻燃基本理论、阻燃剂性能与应用
- 高三第二轮复习之文言翻译(李丽君)省公开课获奖课件市赛课比赛一等奖课件
- 服务礼仪培训课件
- 2024年江苏省盐城市中考语文真题
- 教辅资料进校园审批制度
- 九年级你准备好了吗崔喜利公开课获奖课件百校联赛一等奖课件
评论
0/150
提交评论