摘要: random()函数和rand()函数都可以产生随机数,但是,两者的实现过程是不一样的,在使用这两个函数时总是会遇到一些疑问。该文结合实例分析了rand()函数产生随机数的过程,对不同随机函数的使用有一定的指导意义。
关键词:c++语言; 随机函数;随机数
中图分类号:tp312 文献标识码:a 文章编号:1009-3044(2015)34-0104-02
在c语言中的随机数函数是randomize()和random(),前者是产生随机数的种子,而后者是根据前者生成的种子来产生随机数。random()函数产生的随机数是一种伪随机数。在c++语言的开发工具中(例如dev c++)已经无法使用randomize()函数参数随机数了,取而代之的是rand()函数[1-3],接下来就分析一下rand()函数产生随机数的实现原理。1 产生随机数的实例
c++语言编写的产生随机数的程序,如下代码所示。
#include "stdlib.h"
#include
using namespace std;
int main()
{for(int i=1;i] ;调用rand函数
push eax
push offset randomiz.??_c@_0bf@nkddnmak@>; ascii " random number = %d"首先程序先调用rand函数,然后把返回值赋值给寄存器eax,再把eax返回的随机数赋值给地址[ebp-8]保存,最后把eax的值当做参数压栈后在调用printf()函数[4]。这就是输出模块的底层实现了,由于我们探寻的是rand()的函数的实现原理,所以,接下来探讨一下rand函数的内部实现。
2 rand函数的内部实现
rand函数的内部代码如下:
54e33085 push ecx
54e33086 call msvcr90d._getptd ;调用_getptd函数
54e33094 imul ecx,ecx,343fd ;带符号数乘法指令
54e3309a add ecx,269ec3 ;加法
54e330ac shr eax,10 ;逻辑右移
54e330af and eax,7fff ;和
54e330b4 mov esp,ebp
54e330b6 pop ebp
54e330b7 retn
5e0c3094 69c9 fd430300 imul ecx, ecx, 343fd
5e0c309a 81c1 c29e2600 add ecx, 269ec3
通过反编译后的结果,可以看出原来[eax+14]指向的地址是005a0814,而它的值是0x00000001,也就相当于十进制数1。知道了这个关键点,现在可以把rand( )函数的内部代码简化一下,如下代码所示。
imul ecx, ecx,343fd ;带符号数乘法指令
add ecx, 269ec3 ;加法
shr eax, 10 ;逻辑右移
and eax, 7fff ;和
mov esp, ebp
pop ebp
retn
rand()通过把[eax+14]地址的值赋值给ecx,然后再使用带符号数乘法指令和加法指令进行运算,最后把计算的结果重新赋值给[eax+14],这样做是覆盖掉[eax+14]原先的值00000001,然后在重新计算的[eax+14]的值赋值给eax,eax在进行逻辑右移和和操作[6],通过这些复杂的运算,rand最终生成了一个随机数。
3 自定义随机函数
经过分析,比较清楚的了解了rand( )函数的实现原理,此时,就可以自己编写一个产生随机数的函数了,具体实现代码如下所示。
#include
#include
int _tmain(int argc, _tchar* argv[])
{
int tnum = 0x00000001;
int rnum = 0;
_asm
{
pushad
mov ecx, tnum
imul ecx,ecx,343fdh
add ecx,369ec3h
mov tnum,ecx
mov eax,ecx
shr eax,10h
and eax,7fffh
mov rnum,eax
popad
}
printf(" %d\t",rnum);
system(“pause”);
}
return 0;
}
编译运行此程序,输出的结果与rand函数运行的结果是一样的。
4 结束语
random()、rand()函数都可以产生随机数,但是在不同的编程语言及开发工具中的使用是有差别的。random函数不是ansi c标准,不能在gcc,vc等编译器下编译通过。本文分析了rand函数的内部实现原理,分析了产生随机数的过程,拓展了初学习c语言同学的知识视野,也激发他们探索c语言奥妙的兴趣。
www.99jianzhu.com/包含内容:建筑图纸、PDF/word/ppt 流程,表格,案例,最新,免费下载,施工方案、工程书籍、建筑论文、合同表格、标准规范、CAD图纸等内容。