亚洲免费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
        日韩精品久久中文字幕| 人妻av中文字幕无码专区| 色五月丁香五月综合五月4438| 久久午夜无码鲁丝片直播午夜精品| 亚洲91av| 91色婷婷成人精品亚洲| 国产丝袜美腿在线播放| 久久97久久97精品免视看 | 久久偷拍国内亚洲青青草| 国产精品一区二区三区四区亚洲| 在线观看免费日韩精品| 国产强被迫伦姧在线观看无码| 欧美在线 | 亚洲| 日韩精品无码区免费专区 | 日韩欧美在线综合网另类| 人妻有码中文字幕| 粗了大了 整进去好爽视频| 性做久久久久久久| 精品国模人妻视频网站| 成熟了的熟妇毛茸茸| 色一情一乱一伦一区二区三区| 在线a人片免费观看国产| 成人爽a毛片在线播放| 人妻少妇出轨中文字幕| 东北无码熟妇人妻AV在线| 美女扒开内裤露黑毛无遮挡| 亚洲国产性夜夜综合另类| 亚洲 另类 日韩 制服 无码| 97精品伊人久久大香线蕉app| 亚洲熟妇夜夜一区二区三区| 少妇被黑人嗷嗷大叫视频| 国产精品第一国产精品| 精品国产福利久久久| 国产一区二区三区经典| 美女视频在线观看网址大全| 人妻夜夜爽天天爽三区| 91免费永久国产在线观看| 日本岛国视频在线观看一区二区| 伊人久久大香线蕉av不变影院| 精品日产卡一卡二卡国色天香| 国产欧美日韩综合一区二区三区|