VC获取一定范围内的随机数 一、C中不能使用random函数random函数不是ANSI C标准不能在gccvc等编译器下编译通过。可改用C下的rand函数来实现。1C标准函数库提供一随机数生成器rand返回0-RAND_MAX之间均匀分布的伪随机整数。RAND_MAX必须至少为32767rand函数不接受参数默认以1为种子即起始值。随机数生成器总是以相同的种子开始所以形成的伪随机数列也相同失去了随机意义。但这样便于程序调试 2C中另一函数srand可以指定不同的数无符号整数变元为种子。但是如果种子相同伪随机数列也相同。一个办法是让用户输入种子但是仍然不理想。 3、比较理想的是用变化的数比如时间来作为随机数生成器的种子。time的值每时每刻都不同。所以种子不同所以产生的随机数也不同。 //C随机函数VC program include stdio.h include iostream include time.h using namespace std define MAX 100 int mainint argccharargv srandunsignedtimeNULL//srand函数产生一个以当前时间开始的随机种子.应该放在for等循环语句前面不然要很长时间等待 forint i0i 10i cout randMAX endl//MAX为最大值其随机域为0MAX-1 return 0 二、rand的用法 rand不需要参数它会返回一个从0到最大随机数的任意整数最大随机数的大小通常是固定的一个大整数。这样如果你要产生01010个整数可以表达为 int Nrand11 这样N的值就是一个010的随机数如果要产生110printf函数原型在什么头文件里则是这样 int N1rand11 总结来说可以表示为 arandn 其中的a是起始值n是整数的范围。arandb-a1就表示ab
之间的一个随机数若要01的小数则可以先取得010的整数然后均除以10即可得到随机到十分位的10个随机小数若要得到随机到百分位的随机小数则需要先得到010010个整数然后均除以100其它情况依 此类推。 通常rand产生的随机数在每次运行的时候都是与上一次相同的这是有意这样设计的是为了便于程序的调试。若要产生每次不同的随机数可以使用srandseed函数进行随机化随着seed的不同就能够产生不同的随机数。 如大家所说还可以包含time.h头文件然后使用srandtime0来使用当前时间使随机数发生器随机化这样就可以保证每两次运行时可以得到不同的随机数序列只要两次运行的间隔超过1秒。 _ 要怎么样才能真正产生有效的随机数 工作原理如下 1首先给srand提供一个种子它是一个unsigned int类型其取值范围从065535 2然后调用rand它会根据提供给srand的种子值返回一个随机数在032767之间 3根据需要多次调用rand从而不间断地得到新的随机数 4无论什么时候都可以给srand提供一个新的种子从而进一步随机化rand的输出结果。 因为srand函数是一个随机数产生函数其意思就是指C语言里的随机数都是由它来控制产生的如果在应用srand函数之前就用随机函数rand则相当于使用了srand1 而将srandunsignedtimeNULL这条语句放在了for循环里即是用了srandunsignedtime0故此句语句不变的话产生的随机数就不变 C语言随机函数总结rand函数 原型int randvoid 功能产生从0RAND_MAX0x7fff之间的随机数。 头文件stdlib.
h include stdio.h include stdlib.h int main int k krand printfdnk return 0 2srand函数 原型void srandunsigned seed 功能产生随机数的起始发生数据和rand函数配合使用 头文件stdlib.h time.h include stdio.h include stdlib.h include time.h void main time_t t srandunsignedtimet printfdnrand0 这时运行程序会发现每次产生的随机数都不一样。这是因为这里采用了时间作为种子而时间在每时每刻都不相同所以就产生了随机的随机数了。所以要想产生不同的随机数在使用rand之前需要先调用srand _ 伪随机数生成及在VC中的实现 摘要伪随机数在计算机软件设计中有很广泛的用途。本文介绍了基于数学方法的利用计算机产生伪随机数的一种方法即线性同余法任何伪随机数的产生都是运用递推的原理来生成的。以及在Visual C环境中产生伪随机数的两个重要函数randsrand函数正确地使用这两个函数是产生性能良好的伪随机数的关键最后介绍了利用伪随机数生成技术在MFC中生成基于C/S模式应用程序的随机校验码以及利用一种软件工具ImagePassword产生随机密码。 关键词伪随机数生成线性同余法Visual C随机校验码 为追求真正的随机序列人们曾采用很多种原始的物理方法用于生成一定范围内满足精度位数的均匀分布序列其缺点在于速度慢、效率低、需占用大量存储空间且不可重现等。为满足计算机模拟研究的需求人们转而研究用算法生成模拟各种概率分布的伪随机序列。伪随机数是指用数学递推公式所产生的随机数。从实用的
角度看获取这种数的最简单和最自然的方法是利用计算机语言的函数库提供的随机数发生器。典型情况下它会输出一个均匀分布在01区间内的伪随机变量的值。其中应用的最为广泛、研究最彻底的一个算法即线性同余法。 线性同余法LCGLinear Congruence Generator 选取足够大的正整数M和任意自然数n0ab由递推公式 ni1afnibmod Mi01…M-1 生成的数值序列称为是同余序列。当函数fn为线性函数时即得到线性同余序列 ni1anibmod Mi01…M-1 以下是线性同余法生成伪随机数的伪代码 Randomnmseedab r0seed fori1ini riari-1bmod m 其中种子参数seed可以任意选择常常将它设为计算机当前的日期或者时间m是一个较大数可以把它取为2ww是计算机的字长a可以是0.01w0.99w之间的任何整数。 应用递推公式产生均匀分布随机数时式中参数n0abM的选取十分重要。 例如选取M10abn07生成的随机序列为690769…周期为4 M16a5b3n07生成的随机序列为618111051215149032134761…周期为16 M8a5b1n01生成的随机序列为6745230167…周期为8 Visual C中伪随机数生成机制 VC产生随机数有两个函数分别为randvoidsrandseedrand产生的随机整数是在0RAND_MAX之间平均分布的RAND_MAX是一个常量定义为define RAND_MAX 0x7fff。它是short型数据的最大值如果要产生一个浮点型的随机数可以将rand/1000.0这样就得到一个032.767之间平均分布的随机浮点数。如果要使得范围大一点那么可以通过产生几个随机数
的线性组合来实现任意范围内的平均分布的随机数。 其用法是先调用srand函数如 srandunsignedtimeNULL 这样可以使得每次产生的随机数序列不同。如果计算伪随机序列的初始数值称为种子相同则计算出来的伪随机序列就是完全相同的。要解决这个问题需要在每次产生随机序列前先指定不同的种子这样计算出来的随机序列就不会完全相同了。以time函数值即当前时间作为种子数因为两次调用rand函数的时间通常是不同的这样就可以保证随机性了。也可以使用srand函数来人为指定种子数。 分析以下两个程序段 程序段1 //包含头文件 void main int count0 forint i0i 10i srandunsignedtimeNULL count coutNoRAND 程序段1中由于将srand函数放在循环体内而程序执行的CPU时间较快调用time函数获取的时间精度却较低55ms这样循环体内每次产生随机数用到的种子数都是一样的因此产生的随机数也是一样的。而程序段2中第1次产生的随机数要用到随机种子以后的每次产生随机数都是利用递推关系得到的。 基于MFC的随机校验码生成 Web应用程序中经常要利用到随机校验码校验码的主要作用是防止黑客利用工具软件在线破译用户登录密码校验码、用户名、密码三者配合组成了进入Web应用系统的钥匙。在利用VC开发的基于客户机/浏览器Client/Server模式的应用软件系统中为了防止非法用户入侵系统通常也要运用随机校验码生成技术。 本实现要用到以上介绍到的伪随机数生成技术。校验码数据将以16进制码方式显示。主要代码如下 v
oid CRandompasswordDlgOnCreatekey int RanCheckNum0 char out250 char keytemp50 memsetout0x3018 srandunsignedtimeGetTime//产生随机数种子 forint i0i 6i RanCheckNumrand//产生随机数 _itoaRanCheckNumkeytemp16//将随机数转换成16进制 memcpyouti4keytempstrlenkeytemp out240x00 strcpym_key.GetBuffer18out UpdateDataFALSE 运行结果如图1所示 1利用伪随机数生成随机校验码 程序运行时由于每一次点击产生随机校验码的系统时间不同生成随机数的种子就不一样因此产生的随机数也是不一样的从而保证了校验码生成的随机性。 利用ImagePassword工具产生随机密码 ImagePassword提供一个可选择的图形阵列通过随机改变图形阵列中的阵点图形来产生随机密码。当随机点击图象阵列中的图象阵点该阵点中的图象发生变化。其运行界面如图2所示 2 ImagePassword运行界面 点击OK按钮后所产生的随机密码如图3所示 3 ImagePassword运行结果 ImagePassword产生的密码的随机性依赖于用户对图象阵列中阵点图象的随机选择一般来说用户在图象阵列中随机点击鼠标的次数越多最后产生的密码的随机性越强。 结束语 伪随机数在不同的软件系统中都得到了很广泛的应用如何选择随机数生成种子使得生成的伪随机数性能更佳是软件设计者追求的目标之一。本文提到了利用系统时间作为种子参数在一定条件下可以满足软件的随机性需要。利用所产生的随机数在游戏编程如扑克类游戏中的随机发牌俄罗斯方块的随机生成等等其他应用中都起到很重要的作用。