亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        C和C++語言產(chǎn)生隨機數(shù)的過程分析

        2016-03-07 12:56:07周建儒
        電腦知識與技術(shù) 2015年34期
        關(guān)鍵詞:語言

        摘要: random()函數(shù)和rand()函數(shù)都可以產(chǎn)生隨機數(shù),但是,兩者的實現(xiàn)過程是不一樣的,在使用這兩個函數(shù)時總是會遇到一些疑問。該文結(jié)合實例分析了rand()函數(shù)產(chǎn)生隨機數(shù)的過程,對不同隨機函數(shù)的使用有一定的指導(dǎo)意義。

        關(guān)鍵詞:C++語言; 隨機函數(shù);隨機數(shù)

        中圖分類號:TP312 文獻標(biāo)識碼: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語言中的隨機數(shù)函數(shù)是randomize()和random(),前者是產(chǎn)生隨機數(shù)的種子,而后者是根據(jù)前者生成的種子來產(chǎn)生隨機數(shù)。random()函數(shù)產(chǎn)生的隨機數(shù)是一種偽隨機數(shù)。在C++語言的開發(fā)工具中(例如DEV C++)已經(jīng)無法使用randomize()函數(shù)參數(shù)隨機數(shù)了,取而代之的是rand()函數(shù)[1-3],接下來就分析一下rand()函數(shù)產(chǎn)生隨機數(shù)的實現(xiàn)原理。

        1 產(chǎn)生隨機數(shù)的實例

        C++語言編寫的產(chǎn)生隨機數(shù)的程序,如下代碼所示。

        #include "stdlib.h"

        #include

        using namespace std;

        int main()

        {for(int i=1;i<=10;i++)

        cout<

        return 0; }

        程序運行后輸出10個整數(shù),分別是:

        41 18467 6334 26500 19169 15724 11478 29358 26962 24464

        為了更加清晰的了解rand( )函數(shù),可以通過工具逆向分析一下這個程序,逆向生成的主要代碼如下。

        CALL DWORD PTRDS:[<&MSVCR90D.rand>] ;調(diào)用rand函數(shù)

        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>]

        首先程序先調(diào)用rand函數(shù),然后把返回值賦值給寄存器EAX,再把EAX返回的隨機數(shù)賦值給地址[EBP-8]保存,最后把EAX的值當(dāng)做參數(shù)壓棧后在調(diào)用printf()函數(shù)[4]。這就是輸出模塊的底層實現(xiàn)了,由于我們探尋的是rand()的函數(shù)的實現(xiàn)原理,所以,接下來探討一下rand函數(shù)的內(nèi)部實現(xiàn)。

        2 rand函數(shù)的內(nèi)部實現(xiàn)

        rand函數(shù)的內(nèi)部代碼如下:

        54E33085 PUSH ECX

        54E33086 CALL MSVCR90D._getptd ;調(diào)用_getptd函數(shù)

        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 ;帶符號數(shù)乘法指令

        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( )函數(shù)的內(nèi)部調(diào)用了一個未公開的函數(shù)_getptd(),無法得知_getptd( )函數(shù)的內(nèi)部細節(jié),不知道這個函數(shù)做了什么。但是,可以分析整個函數(shù)的代碼,并結(jié)合rand函數(shù)的外部代碼,可以看出_getptd( )函數(shù)的返回值并沒有被使用。同時,變量[EAX+14]這個值引起了高度關(guān)注,可以深入分析變量[EAX+14]得出關(guān)于_getptd( )函數(shù)的信息[5]??梢越柚鶲llyDbg動態(tài)反匯編工具看一看[EAX+14]的初始值,反匯編代碼如下所示。

        5E0C308B 8945 FC MOV DWORD PTR SS:[EBP-4], EAX

        5E0C308E 8B45 FC MOV EAX, DWORD PTR SS:[EBP-4], EAX

        5E0C3091 8B4814 MOV ECX, DWORD PTR DS:[EAX+14]

        5E0C3094 69C9 FD430300 IMUL ECX, ECX, 343FD

        5E0C309A 81C1 C29E2600 ADD ECX, 269EC3

        5E0C30A0 8B55 FC MOV EDX, DWORD PTR SS:[EBP-4]

        5E0C30A3 894A 14 MOV DWORD PTR DS:[EDX+14], ECX

        5E0C30A6 8B45 FC MOV EAX, DWORD PTR SS:[EBP-4]

        5E0C30A9 8B40 14 MOV EAX, DWORD PTR DS:[EAX+14]

        通過反編譯后的結(jié)果,可以看出原來[EAX+14]指向的地址是005A0814,而它的值是0x00000001,也就相當(dāng)于十進制數(shù)1。知道了這個關(guān)鍵點,現(xiàn)在可以把rand( )函數(shù)的內(nèi)部代碼簡化一下,如下代碼所示。

        MOV ECX, DWORD PTR DS:[EAX+14] ;ECX=000000001

        IMUL ECX, ECX,343FD ;帶符號數(shù)乘法指令

        ADD ECX, 269EC3 ;加法

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

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

        SHR EAX, 10 ;邏輯右移

        AND EAX, 7FFF ;和

        MOV ESP, EBP

        POP EBP

        RETN

        rand()通過把[EAX+14]地址的值賦值給ECX,然后再使用帶符號數(shù)乘法指令和加法指令進行運算,最后把計算的結(jié)果重新賦值給[EAX+14],這樣做是覆蓋掉[EAX+14]原先的值00000001,然后在重新計算的[EAX+14]的值賦值給EAX,EAX在進行邏輯右移和和操作[6],通過這些復(fù)雜的運算,rand最終生成了一個隨機數(shù)。

        3 自定義隨機函數(shù)

        經(jīng)過分析,比較清楚的了解了rand( )函數(shù)的實現(xiàn)原理,此時,就可以自己編寫一個產(chǎn)生隨機數(shù)的函數(shù)了,具體實現(xiàn)代碼如下所示。

        #include

        #include

        int _tmain(int argc, _TCHAR* argv[])

        {

        int tnum = 0x00000001;

        int Rnum = 0;

        while(1){

        _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;

        }

        編譯運行此程序,輸出的結(jié)果與rand函數(shù)運行的結(jié)果是一樣的。

        4 結(jié)束語

        random()、rand()函數(shù)都可以產(chǎn)生隨機數(shù),但是在不同的編程語言及開發(fā)工具中的使用是有差別的。random函數(shù)不是ANSI C標(biāo)準,不能在gcc,vc等編譯器下編譯通過。本文分析了rand函數(shù)的內(nèi)部實現(xiàn)原理,分析了產(chǎn)生隨機數(shù)的過程,拓展了初學(xué)習(xí)C語言同學(xué)的知識視野,也激發(fā)他們探索C語言奧妙的興趣。

        參考文獻:

        [1] 周建儒.C語言中邏輯關(guān)系與邏輯運算的分析[J].電子測試,2012(22):38-39.

        [2] 周志德,候正昌.C++程序設(shè)計[M].北京:電子工業(yè)出版社,2005.

        [3] 埃克爾,劉宗田.C++編程思想[M].北京:機械工業(yè)出版社,2012.

        [4] 趙鳳芝.C語言程序設(shè)計能力教程[M].北京:中國鐵道出版社,2006.

        [5] 劉金魁.C語言程序設(shè)計基礎(chǔ)[M].北京:中國鐵道出版社,2014.

        [6] 田美艷.計算機中C語言的應(yīng)用特點分析[J].電子制作,2015(4):87.

        猜你喜歡
        語言
        詩之新,以語言創(chuàng)造為基
        中華詩詞(2023年8期)2023-02-06 08:51:28
        (n,k)-語言及左-(n,k)-語言的一些性質(zhì)
        語言是刀
        文苑(2020年4期)2020-05-30 12:35:30
        讓語言描寫搖曳多姿
        多向度交往對語言磨蝕的補正之道
        累積動態(tài)分析下的同聲傳譯語言壓縮
        日常語言與播音語言
        新聞傳播(2016年10期)2016-09-26 12:15:04
        語言技能退化與語言瀕危
        我有我語言
        論語言的“得體”
        語文知識(2014年10期)2014-02-28 22:00:56
        97在线观看视频| 久久精品国产亚洲av日韩精品| 国产精品一区二区夜色不卡| 电影内射视频免费观看| 国产亚洲av无码专区a∨麻豆 | 国产精品毛片一区二区三区| 亚洲乱码日产精品bd在线观看| 丰满熟妇人妻av无码区| 亚洲高清一区二区精品| 国产私人尤物无码不卡| 亚洲精品无码mv在线观看| 韩国主播av福利一区二区| 国产无卡视频在线观看| 无码人妻一区二区三区在线| 无码人妻精品一区二区三区在线 | 91国产自拍精品视频| 久久人妻无码一区二区| 97人人超碰国产精品最新o| 最新永久免费AV网站| 论理视频二区三区四区在线观看 | 亚洲国产成人Av毛片大全| 亚洲中文字幕一区二区三区多人| 中国女人内谢69xxxxxa片| 欧洲日本一线二线三线区本庄铃| 国产乱子伦农村xxxx| 国产一区二区三区 在线观看| 中文字幕一区日韩精品| 久久中文字幕乱码免费| 亚洲第一页综合av免费在线观看| 不卡一区二区黄色av| 国产美女自慰在线观看| 久久精品国产热久久精品国产亚洲 | 亚洲色欲久久久综合网| 国产精品九九久久一区hh| 综合成人亚洲网友偷自拍| 亚洲欧美日韩另类精品一区 | 国产精品无码dvd在线观看| 中文字幕无码精品亚洲资源网久久 | 日本刺激视频一区二区| 精品亚洲成a人片在线观看| 91白浆在线视频|