C和C++语言产生随机数的过程分析

 

摘要: 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图纸等内容。


TOP最近更新内容

    园林史名词解释
    长城小学关爱留守儿童工作制度
  • 上一篇:犯罪未遂的概念和特征
  • 下一篇:请回答民事责任竞合概念、特点和法律效果