APP下载

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

2016-03-07周建儒

电脑知识与技术 2015年34期
关键词:语言

摘要: random()函数和rand()函数都可以产生随机数,但是,两者的实现过程是不一样的,在使用这两个函数时总是会遇到一些疑问。该文结合实例分析了rand()函数产生随机数的过程,对不同随机函数的使用有一定的指导意义。

关键词:C++语言; 随机函数;随机数

中图分类号:TP312 文献标识码:A 文章编号:1009-3044(2015)34-0104-02

Abstract: random () function and rand () function can generate random numbers, but both the implementation process is not the same when using these two functions will always encounter some doubts. Examples of this paper analyzes the rand () function generates a random number process, the use of different random function has a certain significance.

Key words: C ++ language; random function; random numbers

在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<=10;i++)

cout<

return 0; }

程序运行后输出10个整数,分别是:

41 18467 6334 26500 19169 15724 11478 29358 26962 24464

为了更加清晰的了解rand( )函数,可以通过工具逆向分析一下这个程序,逆向生成的主要代码如下。

CALL DWORD PTRDS:[<&MSVCR90D.rand>] ;调用rand函数

MOV DWORD PTR SS:[EBP-8],EAX ;rand的返回值赋值保存给[EBP-8]

MOV EAX,DWORD PTR SS:[EBP-8]

PUSH EAX

PUSH OFFSET Randomiz.??_C@_0BF@NKDDNMAK@>; ASCII " Random number = %d"

CALL DWORD PTR DS:[<&MSVCR90D.printf>]

首先程序先调用rand函数,然后把返回值赋值给寄存器EAX,再把EAX返回的随机数赋值给地址[EBP-8]保存,最后把EAX的值当做参数压栈后在调用printf()函数[4]。这就是输出模块的底层实现了,由于我们探寻的是rand()的函数的实现原理,所以,接下来探讨一下rand函数的内部实现。

2 rand函数的内部实现

rand函数的内部代码如下:

54E33085 PUSH ECX

54E33086 CALL MSVCR90D._getptd ;调用_getptd函数

54E3308B MOV DWORD PTR SS:[EBP-4],EAX

54E3308E MOV EAX,DWORD PTR SS:[EBP-4]

54E33091 MOV ECX,DWORD PTR DS:[EAX+14]

54E33094 IMUL ECX,ECX,343FD ;带符号数乘法指令

54E3309A ADD ECX,269EC3 ;加法

54E330A0 MOV EDX,DWORD PTR SS:[EBP-4]

54E330A3 MOV DWORD PTR DS:[EDX+14],ECX

54E330A6 MOV EAX,DWORD PTR SS:[EBP-4]

54E330A9 MOV EAX,DWORD PTR DS:[EAX+14]

54E330AC SHR EAX,10 ;逻辑右移

54E330AF AND EAX,7FFF ;和

54E330B4 MOV ESP,EBP

54E330B6 POP EBP

54E330B7 RETN

在rand( )函数的内部调用了一个未公开的函数_getptd(),无法得知_getptd( )函数的内部细节,不知道这个函数做了什么。但是,可以分析整个函数的代码,并结合rand函数的外部代码,可以看出_getptd( )函数的返回值并没有被使用。……

登录APP查看全文

猜你喜欢

语言
诗之新,以语言创造为基
语言是刀
让语言描写摇曳多姿
多向度交往对语言磨蚀的补正之道
日常语言与播音语言
语言技能退化与语言濒危
我有我语言
论语言的“得体”
Only Words慎用你的语言
大自然的语言