版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、VC获取一定范围内的随机数一、C中不能使用random函数random函数不是 ANSI C标准不能在gccvc等编译器下编 译通过。可改用 C下的rand函数来实现。1、C标准函数库 提供一随机数生成器 rand返回0-RAND_MAX 之间均匀分布 的伪随机整数。RAND_MAX 必须至少为32767。rand函数 不接受参数默认以1为种子即起始值。随机数生成器总是以 相同的种子开始所以形成的伪随机数列也相同失去了随机 意义。但这样便于程序调试2、C中另一函数srand可以指定不同的数无符号整数变元为种子。但是如果种子相同伪随 机数列也相同。一个办法是让用户输入种子但是仍然不理 想。3、比
2、较理想的是用变化的数比如时间来作为随机数生 成器的种子。time的值每时每刻都不同。所以种子不同所以 产生的随机数也不同。/C随机函数 VC program includestdio.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为最大值其随
3、机域为OMAX-1 return 0 二、rand的用法rand不需要参数它会 返回一个从0到最大随机数的任意整数最大随机数的大小通 常是固定的一个大整数。这样如果你要产生010的10个整数可以表达为int Nrand11这样N的值就是一个010的随机数如果要产生 110 则是这样 int N1rand11 总结来说可以表 示为 arandn 其中的 a 是起始值 n 是整数的范围。 arandb-a1 就表示ab之间的一个随机数若要01的小数则可以先取得010 的整数然后均除以 1 0即可得到随机到十分位的10 个随机小数若要得到随机到百分位的随机小数则需要先得到0100 的 10 个整数然
4、后均除以 100 其它情况依 此类推。 通 常 rand 产生的随机数在每次运行的时候都是与上一次相同 的这是有意这样设计的是为了便于程序的调试。若要产生每 次不同的随机数可以使用srandseed函数进行随机化随着seed的不同就能够产生不同的随机数。如大家所说还可以包含 time.h 头文件然后使用 srandtime0 来使用当前时间使随 机数发生器随机化这样就可以保证每两次运行时可以得到 不同的随机数序列只要两次运行的间隔超过 1 秒。 _ 要怎 么样才能真正产生有效的随机数 工作原理如下 1 首先给 srand提供一个种子它是一个unsigned int类型其取值范围从065535
5、2然后调用rand它会根据提供给srand的种子值返回 一个随机数在 0 到 32767 之间 3 根据需要多次调用 rand 从 而不间断地得到新的随机数 4 无论什么时候都可以给 srand 提供一个新的种子从而进一步随机化 rand 的输出结果。 因 为srand函数是一个随机数产生函数其意思就是指C语言里的随机数都是由它来控制产生的如果在应用srand函数之前就用随机函数 rand 则相当于使用了 srand1 而将srandunsignedtimeNULL 这条语句放在了 for 循环里即是用了 srandunsignedtime0 故此句语句不变的话产生的随机数就不 变 C 语言随
6、机函数总结 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 ti
7、me_t t srandunsignedtimet printfdnrand0 这时运行程序 会发现每次产生的随机数都不一样。这是因为这里采用了时 间作为种子而时间在每时每刻都不相同所以就产生了随机 的随机数了。 所以要想产生不同的随机数在使用 rand 之前需 要先调用 srand。 _ 伪随机数生成及在 VC 中的实现 摘要伪 随机数在计算机软件设计中有很广泛的用途。本文介绍了基 于数学方法的利用计算机产生伪随机数的一种方法即线性 同余法任何伪随机数的产生都是运用递推的原理来生成的。以及在Visual C环境中产生伪随机数的两个重要函数rand和srand函数正确地使用这两个函数是产生性能
8、良好的伪随机 数的关键最后介绍了利用伪随机数生成技术在 MFC 中生成 基于 C/S 模式应用程序的随机校验码以及利用一种软件工具 ImagePassword 产生随机密码。 关键词伪随机数生成线性同 余法 Visual C 随机校验码 为追求真正的随机序列人们曾采 用很多种原始的物理方法用于生成一定范围内满足精度位 数的均匀分布序列其缺点在于速度慢、效率低、需占用大量 存储空间且不可重现等。为满足计算机模拟研究的需求人们 转而研究用算法生成模拟各种概率分布的伪随机序列。伪随 机数是指用数学递推公式所产生的随机数。从实用的角度看 获取这种数的最简单和最自然的方法是利用计算机语言的 函数库提供的
9、随机数发生器。典型情况下它会输出一个均匀 分布在 0 和 1 区间内的伪随机变量的值。其中应用的最为广 泛、研究最彻底的一个算法即线性同余法。 线性同余法 LCGLinear Congruence Generator 选取足够大的正整数 M 和 任意自然数nOab由递推公式 nilafnibmod Mi01皿-1生成 的数值序列称为是同余序列。 当函数 fn 为线性函数时即得到 线性同余序列 nilanibmod Mi01训-1以下是线性同余法生 成伪随机数的伪代码 Randomnmseedab rOseed fori1ini riari-1bmod m 其中种子参数seed可以任意选择常常将
10、它设 为计算机当前的日期或者时间 m 是一个较大数可以把它取 为2ww是计算机的字长 a可以是0.01w和0.99w之间的任何 整数。 应用递推公式产生均匀分布随机数时式中参数 nOabM 的选取十分重要。 例如选取 M1OabnO7 生成的随机序 列为690769周期为4。取M16a5b3n07生成的随机序列为 618111051215149032134761 周期为 16。取 M8a5b1n01 生 成的随机序列为 6745230167周期为8。Visual C中伪随机数生成机制 用 VC 产生随机数有两个函数分别为 randvoid 和 srandseed。 rand 产生的随机整数是在
11、 0RAND_MAX 之间 平均分布的 RAND_MAX 是一个常量定义为 define RAND_MAX 0x7fff 。它是 short 型数据的最大值如果要产生 一个浮点型的随机数可以将 rand/1000.0 这样就得到一个 032.767 之间平均分布的随机浮点数。如果要使得范围大一 点那么可以通过产生几个随机数的线性组合来实现任意范 围内的平均分布的随机数。 其用法是先调用 srand 函数如 srandunsignedtimeNULL 这样可以使得每次产生的随机数序 列不同。如果计算伪随机序列的初始数值称为种子相同则计 算出来的伪随机序列就是完全相同的。要解决这个问题需要 在每次
12、产生随机序列前先指定不同的种子这样计算出来的 随机序列就不会完全相同了。 以 time 函数值即当前时间作为 种子数因为两次调用 rand 函数的时间通常是不同的这样就 可以保证随机性了。也可以使用 srand 函数来人为指定种子 数。 分析以下两个程序段 程序段 1 / 包含头文件 void main int count0 forint i0i 10i srandunsignedtimeNULL count coutNoRAND 程序段 1 中由于将 srand 函数放在循环体内而 程序执行的 CPU 时间较快调用 time 函数获取的时间精度却 较低 55ms 这样循环体内每次产生随机数用
13、到的种子数都是 一样的因此产生的随机数也是一样的。而程序段2 中第 1 次 产生的随机数要用到随机种子以后的每次产生随机数都是 利用递推关系得到的。 基于 MFC 的随机校验码生成 Web 应用程序中经常要利用到随机校验码校验码的主要作用是 防止黑客利用工具软件在线破译用户登录密码校验码、用户 名、密码三者配合组成了进入 Web 应用系统的钥匙。 在利用 VC 开发的基于客户机 / 浏览器 Client/Server 模式的应用软件 系统中为了防止非法用户入侵系统通常也要运用随机校验 码生成技术。 本实现要用到以上介绍到的伪随机数生成技 术。校验码数据将以 16 进制码方式显示。 主要代码如下
14、 void 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 运行结果 ImageP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2009年7月国开电大专科《办公室管理》期末纸质考试试题及答案
- 2026年中国磁流体真空密封件行业市场占有率及投资前景预测分析报告
- 2025年河北省石家庄市新华区公开招聘社区工作者344名笔试考试参考试题及答案解析
- 2025广东中山市板芙镇招聘公办中小学校临聘教师1人笔试考试备考试题及答案解析
- 2025观山湖区第七中学秋招聘临聘教师笔试考试参考试题及答案解析
- (人美2024版)美术三年级上册全册教学设计(新教材)
- 泌尿外科尿道结石清除方案
- 2025年委托诉讼合同
- 2025年科技项目合同范本范文
- 2025年六年级数学上册期末全真模拟提高卷(三)(A4版)(苏教版)
- 基于积极心理学的初中学困生心理干预机制研究
- 2025喀什职业技术学院教师招聘考试试题
- 《爱的教育》读书分享
- 一年级上语文上册课外阅读教案
- 产品数字护照(DPP)技术发展报告(2025年)
- 公安局退款协议书
- 幼儿园大班社会《我去过的地方》
- 湖南单招试题及答案数学
- 食品行业食品安全追溯与溯源系统设计方案
- 胸腔积液护理疑难病例讨论
- 第31 届 WMO 融合创新讨论大会小学四年级初测试卷
评论
0/150
提交评论