伪随机数生成
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
为追求真正的随机序列,人们曾采用很多种原始 的物理方法用于生成一定范围内满足精度(位数)的 均匀分布序列,其缺点在于:速度慢、效率低、需占 用大量存储空间且不可重现等。为满足计算机模拟研 究的需求,人们转而研究用算法生成模拟各种概率分 布的伪随机序列。伪随机数是指用数学递推公式所产 生的随机数。从实用的角度看,获取这种数的最简单 和最自然的方法是利用计算机语言的函数库提供的随 机数发生器。典型情况下,它会输出一个均匀分布在0 和1区间内的伪随机变量的值。其中应用的最为广泛、 研究最彻底的一个算法即线性同余法。
实现界面截图
演讲完毕
谢谢,鼓掌!
主要代码
void C随机码生成器Dlg::OnCreatekey() { int RanCheckNum = 0; char out[25]={0}; char keytemp[5]={0}; memset(out,0x30,18);//memset(void *s, int ch, size_t n)函数解释:将s中 前n个字节替换为ch并返回s srand((unsigned)timeGetTime());//产生随机数种子 for(int i=0;i<6;i++) { RanCheckNum = rand();//产生随机数 _itoa(RanCheckNum,keytemp,16);//将随机数转换成进制 memcpy(&out[i*4],keytemp,strlen(keytemp)); } out[24]=NULL; SetDlgItemText(IDC_EDIT1,_T(out)); }
伪随机数生成
演讲:王东 制作:何定威
摘要
伪随机数在计算机软件设计中有很广泛的用途。 本文介绍了基于数学方法的利用计算机产生伪 随机数的一种方法,即线性同余法,任何伪随 机数的产生都是运用递推的原理来生成的。 在Visual C++环境中产生伪随机数的两个重要 函数,rand和srand函数,正确地使用这两个 函数是产生性能良好的伪随机数的要害,最后 介绍了利用伪随机数生成技术在MFC中生成基 于C/S模式应用程序的随机校验码。
线性同余法LCG(LINEAR CONGRUENCE GENERATOR)
应用递推公式产生均匀分布随机数时,式中参数n0,a,b,M的选 取十分重要。
ቤተ መጻሕፍቲ ባይዱ
例如,选取M=10,a=b =n0=7,生成的随机序列为{6,9,0,7,6, 9,……},周期为4。
取M=16,a=5,b =3,n0=7,生成的随机序列为{6,1,8,11, 10,5,12,15,14,9,0,3,2,13,4,7,6,1……},周期为16。 取M=8,a=5,b =1,n0=1,生成的随机序列为{6,7,4,5,2, 3,0,1,6,7……},周期为8。
线性同余法LCG(LINEAR CONGRUENCE GENERATOR)
选取足够大的正整数M和任意自然数n0,a,b,由递推公式: ni+1=(af(ni)+b)mod M i=0,1,…,M-1 生成的数值序列称为是同余序列。当函数f(n)为线性函数时,即得到线性同 余序列 ni+1=(a*ni+b)mod M i=0,1,…,M-1 以下是线性同余法生成伪随机数的伪代码: Random(n,m,seed,a,b) { r0 = seed; for (i = 1;i<=n;i++) ri = (a*ri-1 + b) mod m } 其中种子参数seed可以任意选择,经常将它设为计算机当前的日期或者时间; m是一个较大数,可以把它取为2w,w是计算机的字长;a可以是0.01w和0.99w之间 的任何整数。
VISUAL C++中伪随机数生成机制
用VC产生随机数有两个函数,分别为rand(void)和srand(seed)。rand()产 生的随机整数是在0~RAND_MAX之间平均分布的,RAND_MAX是一个常量(定义为: #define RAND_MAX 0x7fff)。它是short型数据的最大值,假如要产生一个浮点型 的随机数,可以将rand()/1000.0,这样就得到一个0~32.767之间平均分布的随机 浮点数。假如要使得范围大一点,那么可以通过产生几个随机数的线性组合来实现 任意范围内的平均分布的随机数。 其用法是先调用srand函数,如 srand( (unsigned)time( NULL ) ) 这样可以使得每次产生的随机数序列不同。假如计算伪随机序列的初始数值 (称为种子)相同,则计算出来的伪随机序列就是完全相同的。要解决这个问题, 需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会 完全相同了。以time函数值(即当前时间)作为种子数,因为两次调用rand函数的 时间通常是不同的,这样就可以保证随机性了。也可以使用srand函数来人为指定 种子数。