欢迎来到天天文库
浏览记录
ID:52412196
大小:1.48 MB
页数:3页
时间:2020-03-27
《探寻C语言随机数生成函数的实现原理.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、《自动化与仪器仪表》2016年第2期(总第196期)探寻C语言随机数生成函数的实现原理谢宇,周建儒(四川信息职业技术学院四川广元,628040)摘要:在c语言中mndom()函数和rand()函数都可以参数随机数,但是,他们的实现是不一样的,c语言初学者在使用这两个函数时难免会遇到一些问题,产生疑问,本文深入分析了mnd()函数的实现原理,帮助大家理解随机数的产生过程。关键词:随机数;函数;编译;原理中图分类号:TP39文献标识码:ADOI编码:10.14016/j.cnki.1001—9227.2016.02.219Abstract:intheClanguage,mndom(
2、)functionandmnd()functioncanbeusedasamndomnumber,buttheyarenotthesame,Clanguageforbeginnersintheuseofthesetwofunctionswiuinevitablyencountersomeproblems,thep印erdeeplyanalyzesthe研ncipleofrand()functiontohelpyouunderstandtheprocessofLandomnumber.Keywords:Randomnumber;Function;Compiler;Principl
3、eO引言c语言中的随机数函数是randomize()和random(),前者是产生随机数的种子,而后者是根据前者生成的种子来产生随机数。mndom()函数产生的随机数是一种伪随机数。在VisualStudio2008开发工具中也可以编写c语言程序,但是,在Visualstudio2008中已经无法使用mndomize()函数参数随机数了,因为在VS2008平台上已经没有Randomize()函数了,取而代之的是rand()函数。所以,接下来就来研究下rand()函数的实现原理。1产生随机数的实例首先我们来写一个产生随机数的小程序。#include”stdlib.h”intjma
4、in(intargc,JCHAR木argv[])intd:while(1){d=mnd();printf(”Randomnumber=%d\n”,d);system(”pause”);I℃tum0:程序运行的输出结果如图1所示。图l程序输出结果收稿日期:2015—12—29作者简介:谢宇(1982一),男,四川德阳人,讲师,硕士研究生,主要研究方向为软件技术应用。以上输出了11个由rand()函数产生的数字。为了更加清晰的了解rand函数,可以逆向分析一下这个程序,逆向的主要代码如下。0025lA6EMOVEAX,1;eax=100251A73TESTEAX,EAX;zf=ea
5、x—eax00251A75JESHORTRandomiz.00251ABD;while(eax)00251A77MOVEsI,ESP;保存Esp的值00251A79CALLDw0RD”RDS:[<&MSVCR90D.mnd>];调用Rand函数0025lA7FCMPESI.ESP00251A81cALLRandomiz.0025114A;检查堆栈平衡00251A86MOVDw0RDIyI’RSS:IEBP一8l,EAx00251A89MOVESI.ESP00251A8BMOvEAx,Dw0RDPTRSS:【EBP一800251A8EPUsHEAx;把产生的随机数当做一甜的参数0
6、0251A8FPUSH0FFSETRandomiz.??一C@—0BF@NKDDNMAK@>;ASCII”Randomnumber=%d”;printf输出的格式00251A94CALLDWORDPTRDS:l<&MSVCR90D.prinD];调用Printf函数输出00251A9AADDEsP,8;堆栈平衡00251A9DCMPESI.ESP00251A9FcALLRandomiz.0025114A;检查堆栈平衡00251AA4MOVESI.ESP00251AA6PUSH0FFSETRandomiz.??一C@一05PDJBBECF@pa>;ASCII”pause”0025
7、lAABCALLDWORDPTRDS:l<&MSVCR90D.system>];MsVCR90D.syste调用system函数,暂停程序,输出文字00251ABlADDEsP,4;堆栈平衡00251AB4CMPESI.ESP00251AB6cALLRaIldomiz.0025114A;检查堆栈平衡00251ABBJMPsHORTRandomiz.00251A6E;向上黝b转构成循环00251ABDXOREAX,EAX;eax=0首先程序先调用rand函数,然后把返回值赋值给寄存器EAx,再
此文档下载收益归作者所有