VC获取一定范围内的随机数

VC获取一定范围内的随机数


2024年5月4日发(作者:)

VC获取一定范围内的随机数 一、C中不能使用random函数random函数不是ANSI

C标准不能在gccvc等编译器下编译通过。可改用C下的rand函数来实现。1、C标准函

数库提供一随机数生成器rand返回0-RAND_MAX之间均匀分布的伪随机整数。

RAND_MAX必须至少为32767。rand函数不接受参数默认以1为种子即起始值。随机数

生成器总是以相同的种子开始所以形成的伪随机数列也相同失去了随机意义。但这样便于

程序调试 2、C中另一函数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到最大随机数的任意整数最大随机数的大小通常是固定的一个大整数。

这样如果你要产生010的10个整数可以表达为 int Nrand11 这样N的值就是一个010

的随机数如果要产生110则是这样 int N1rand11 总结来说可以表示为 arandn 其中的

a是起始值n是整数的范围。arandb-a1就表示ab之间的一个随机数若要01的小数则可

以先取得010的整数然后均除以10即可得到随机到十分位的10个随机小数若要得到随机

到百分位的随机小数则需要先得到0100的10个整数然后均除以100其它情况依 此类推。

通常rand产生的随机数在每次运行的时候都是与上一次相同的这是有意这样设计的是为

了便于程序的调试。若要产生每次不同的随机数可以使用srandseed函数进行随机化随着

seed的不同就能够产生不同的随机数。 如大家所说还可以包含time.h头文件然后使用

srandtime0来使用当前时间使随机数发生器随机化这样就可以保证每两次运行时可以得

到不同的随机数序列只要两次运行的间隔超过1秒。 _ 要怎么样才能真正产生有效的随机

数 工作原理如下 1首先给srand提供一个种子它是一个unsigned int类型其取值范围从

065535 2然后调用rand它会根据提供给srand的种子值返回一个随机数在0到32767

之间 3根据需要多次调用rand从而不间断地得到新的随机数 4无论什么时候都可以给

srand提供一个新的种子从而进一步随机化rand的输出结果。 因为srand函数是一个随

机数产生函数其意思就是指C语言里的随机数都是由它来控制产生的如果在应用srand函

数之前就用随机函数rand则相当于使用了srand1 而将srandunsignedtimeNULL这条

语句放在了for循环里即是用了srandunsignedtime0故此句语句不变的话产生的随机数

就不变 C语言随机函数总结rand函数 原型int randvoid 功能产生从0到

RAND_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环境中产生伪随机数的两个重要函数rand和srand

函数正确地使用这两个函数是产生性能良好的伪随机数的关键最后介绍了利用伪随机数生

成技术在MFC中生成基于C/S模式应用程序的随机校验码以及利用一种软件工具

ImagePassword产生随机密码。 关键词伪随机数生成线性同余法Visual C随机校验码 为

追求真正的随机序列人们曾采用很多种原始的物理方法用于生成一定范围内满足精度位数

的均匀分布序列其缺点在于速度慢、效率低、需占用大量存储空间且不可重现等。为满足

计算机模拟研究的需求人们转而研究用算法生成模拟各种概率分布的伪随机序列。伪随机

数是指用数学递推公式所产生的随机数。从实用的角度看获取这种数的最简单和最自然的

方法是利用计算机语言的函数库提供的随机数发生器。典型情况下它会输出一个均匀分布

在0和1区间内的伪随机变量的值。其中应用的最为广泛、研究最彻底的一个算法即线性

同余法。 线性同余法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.01w和0.99w之间的任何整数。 应用递推公

式产生均匀分布随机数时式中参数n0abM的选取十分重要。 例如选取M10abn07生成

的随机序列为690769…周期为4。 取M16a5b3n07生成的随机序列为

6…周期为16。 取M8a5b1n01生成的随机序列为

6745230167…周期为8。 Visual C中伪随机数生成机制 用VC产生随机数有两个函数分

别为randvoid和srandseed。rand产生的随机整数是在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进制码方式显示。主要代码如下 void

CRandompasswordDlgOnCreatekey int RanCheckNum0 char out250 char

keytemp50 memsetout0x3018 srandunsignedtimeGetTime//产生随机数种子 forint

i0i 6i RanCheckNumrand//产生随机数 _itoaRanCheckNumkeytemp16//将随机数转

换成16进制 memcpyouti4keytempstrlenkeytemp out240x00

strcpym_fer18out UpdateDataFALSE 运行结果如图1所示 图1利用伪随机

数生成随机校验码 程序运行时由于每一次点击产生随机校验码的系统时间不同生成随机

数的种子就不一样因此产生的随机数也是不一样的从而保证了校验码生成的随机性。 利用

ImagePassword工具产生随机密码 ImagePassword提供一个可选择的图形阵列通过随

机改变图形阵列中的阵点图形来产生随机密码。当随机点击图象阵列中的图象阵点该阵点

中的图象发生变化。其运行界面如图2所示 图2 ImagePassword运行界面 点击OK按

钮后所产生的随机密码如图3所示 图3 ImagePassword运行结果 ImagePassword产

生的密码的随机性依赖于用户对图象阵列中阵点图象的随机选择一般来说用户在图象阵列

中随机点击鼠标的次数越多最后产生的密码的随机性越强。 结束语 伪随机数在不同的软

件系统中都得到了很广泛的应用如何选择随机数生成种子使得生成的伪随机数性能更佳是

软件设计者追求的目标之一。本文提到了利用系统时间作为种子参数在一定条件下可以满

足软件的随机性需要。利用所产生的随机数在游戏编程如扑克类游戏中的随机发牌俄罗斯

方块的随机生成等等其他应用中都起到很重要的作用。


发布者:admin,转转请注明出处:http://www.yc00.com/news/1714833009a2524627.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信