欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
隨機數的產(chǎn)生原理與實(shí)現

隨機數的產(chǎn)生原理與實(shí)現

下載本節例子程序和源代碼 (3.91 KB)

隨機數的產(chǎn)生在病毒中占有十分重要的地位,尤其是在變形引擎中,沒(méi)有它就不成事了……因此,今天就讓我們來(lái)探討一下如何產(chǎn)生一個(gè)隨機數。

首先值得說(shuō)明的是,要產(chǎn)生一個(gè)隨機數,方法有很多種,例如混沌和分形理論(原理比較復雜,但是公式卻異常簡(jiǎn)單,將來(lái)有空的話(huà)我會(huì )介紹一下)……但是這些方法的缺點(diǎn)是計算難度大,需要花費的時(shí)間多,有沒(méi)有一種實(shí)現起來(lái)比較簡(jiǎn)單的方法呢?

答案是肯定的。我們先來(lái)看一條數學(xué)公式:

Rand_Number = (Rand_Seed * X + Y) mod Z

利用這條公式,我們就可以生成一個(gè)偽隨機數了??墒菫槭裁词?#8220;偽隨機數”呢?因為實(shí)際上要保證每次生成的隨機數都不同,那是不太可能的,我們唯一能做到的只能是盡量使每次生成的數字與前面的不同,并且盡量使生成的數字均勻分布在指定的范圍內。

上面的這條公式就能滿(mǎn)足這兩點(diǎn)。至于為什么……呵呵,我也不懂,因為它牽涉到十分復雜的數學(xué)求證過(guò)程,我們只需要知道如何應用就成了:

Rand_Seed 表示隨機數種子,注意這個(gè)“種子”必須每次都不同,我們可以簡(jiǎn)單地利用 GetTickCount() 這個(gè) API 來(lái)獲得不同的數字,當然,你也可以用別的方法來(lái)取得,例如讀取當前鼠標的坐標等等……

X、Y必須至少有一個(gè)為素數。什么叫素數?Hoho,讓我們來(lái)翻翻小學(xué)課本……素數就是除了 1 和它本身,不能被其他數整除的數字。在這里我們可以簡(jiǎn)單地給 X、Y 賦值 23 和 7 ,其實(shí)別的素數也行,我只是隨便取了這兩個(gè)數字。

最后,Z 也應該是一個(gè)素數,這樣才能保證產(chǎn)生的隨機數能得到上限的值。不過(guò)我在實(shí)踐中發(fā)現,這個(gè) Z 不一定要準確地為素數。Why? I also don’t know...

總結一下,利用以上的公式,我們可以編寫(xiě)匯編代碼如下:

iRand   proc uses ecx edx first:DWORD, second:DWORD
    invoke GetTickCount ; 取得隨機數種子,當然,可用別的方法代替
    mov ecx, 23         ; X = ecx = 23
    mul ecx             ; eax = eax * X
    add eax, 7          ; eax = eax + Y (Y = 7)
    mov ecx, second     ; ecx = 上限
    sub ecx, first      ; ecx = 上限 - 下限
    inc ecx             ; Z = ecx + 1 (得到了范圍)
    xor edx, edx        ; edx = 0
    div ecx             ; eax = eax mod Z (余數在edx里面)
    add edx, first      ; 修正產(chǎn)生的隨機數的范圍
    mov eax, edx        ; eax = Rand_Number
    ret
iRand   endp

然后用以下語(yǔ)句調用:

invoke iRand, 1, 100

這樣就產(chǎn)生了一個(gè)在 1 和 100 之間的隨機數啦。

是不是很簡(jiǎn)單呢?最后我再給出一個(gè)利用本代碼的例子,演示如何生成隨機數:

;*********************************************************
;程序名稱(chēng):隨機數的產(chǎn)生原理與實(shí)現
;作者:羅聰
;日期:2002-11-21
;出處:http://www.LuoCong.com(老羅的繽紛天地)
;注意事項:如欲轉載,請保持本程序的完整,并注明:
;轉載自“老羅的繽紛天地”(http://www.LuoCong.com)
;*********************************************************

.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

WndProc         proto :DWORD, :DWORD, :DWORD, :DWORD
iRand           proto :DWORD, :DWORD

.const
IDC_BUTTON_GENERATE equ 3000
IDC_EDIT_FIRST      equ 3001
IDC_EDIT_SECOND     equ 3002

.data
szDlgName           db  "lc_dialog", 0
szCaption           db  "Rand Number Generator by LC", 0
szText              db  255 dup(0)
szTemplate          db  "(%d ~ %d)隨機數:", 13, 10, 13, 10,\
                        "         %d", 13, 10, 13, 10,\
                        "老羅的繽紛天地", 13, 10,\
                        "http://www.LuoCong.com", 0
nFirst              dd  0
nSecond             dd  0

.code
main:
    invoke GetModuleHandle, NULL
    invoke DialogBoxParam, eax, offset szDlgName, 0, WndProc, 0
    invoke ExitProcess, eax

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    LOCAL hEdit: HWND

    .if uMsg == WM_CLOSE
        invoke EndDialog, hWnd, 0
        
    .elseif uMsg == WM_COMMAND
        mov eax, wParam
        mov edx, eax
        shr edx, 16
        movzx eax, ax
        .if edx == BN_CLICKED
            .if eax == IDCANCEL
                invoke EndDialog, hWnd, NULL
            .elseif eax == IDC_BUTTON_GENERATE || eax == IDOK
                ;獲得上限:
                invoke GetDlgItemInt, hWnd, IDC_EDIT_FIRST, NULL, TRUE
                mov nFirst, eax
                ;獲得下限:
                invoke GetDlgItemInt, hWnd, IDC_EDIT_SECOND, NULL, TRUE
                mov nSecond, eax
                ;產(chǎn)生隨機數:
                invoke iRand, nFirst, nSecond
                ;輸出:
                invoke wsprintf, addr szText, addr szTemplate, nFirst, nSecond, eax
                invoke MessageBox, hWnd, addr szText, addr szCaption, MB_OK or MB_ICONINFORMATION
            .endif
        .endif
    .else
        mov eax, FALSE
        ret
    .endif
    mov eax, TRUE
    ret
WndProc endp

;**********************************************************************
; 函數功能:產(chǎn)生范圍從 first 到 second 的隨機數
; 傳入參數:
;           first  = 下限
;           second = 上限
; 返回參數:
;           eax = Rand_Number
; 所用公式:
;           Rand_Number = (Rand_Seed * X + Y) mod Z
; 補充說(shuō)明:
;           (1)本例中用 GetTickCount 來(lái)取得隨機數種子,
;              在實(shí)際應用中,可用別的方法代替。
;           (2)要產(chǎn)生隨機數,X和Y其中之一必須是素數,
;              所以 X = 23, Y = 7(可用別的素數代替)
;**********************************************************************
iRand   proc uses ecx edx first:DWORD, second:DWORD
    invoke GetTickCount ; 取得隨機數種子,當然,可用別的方法代替
    mov ecx, 23         ; X = ecx = 23
    mul ecx             ; eax = eax * X
    add eax, 7          ; eax = eax + Y (Y = 7)
    mov ecx, second     ; ecx = 上限
    sub ecx, first      ; ecx = 上限 - 下限
    inc ecx             ; Z = ecx + 1 (得到了范圍)
    xor edx, edx        ; edx = 0
    div ecx             ; eax = eax mod Z (余數在edx里面)
    add edx, first      ; 修正產(chǎn)生的隨機數的范圍
    mov eax, edx        ; eax = Rand_Number
    ret
iRand   endp

end main
;********************   over    ********************
;by LC

它的資源文件:

#include "resource.h"

#define IDC_BUTTON_GENERATE 3000
#define IDC_EDIT_FIRST      3001
#define IDC_EDIT_SECOND     3002
#define IDC_STATIC          -1

LC_DIALOG DIALOGEX 10, 10, 210, 60
STYLE DS_SETFONT | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Rand Number Generator by LC, 2002-11-21"
FONT 8, "MS Sans Serif"
BEGIN
    LTEXT           "Please input the range below:", IDC_STATIC, 5, 5, 200, 10
    RTEXT           "From:", IDC_STATIC, 10, 20, 20, 10
    EDITTEXT        IDC_EDIT_FIRST, 30, 20, 70, 10, ES_AUTOHSCROLL | NOT WS_BORDER, WS_EX_STATICEDGE
    RTEXT           "To:", IDC_STATIC, 110, 20, 20, 10
    EDITTEXT        IDC_EDIT_SECOND, 130, 20, 70, 10, ES_AUTOHSCROLL | NOT WS_BORDER, WS_EX_STATICEDGE
    DEFPUSHBUTTON   "Generate(&G)", IDC_BUTTON_GENERATE, 70, 40, 50, 13, BS_FLAT | BS_CENTER
END

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
矛與盾的較量(2)——CRC原理篇
把我的第一個(gè)匯編程序(QQ自動(dòng)群發(fā)器)源碼與和我一樣初級的編程愛(ài)好者共享
Win32匯編語(yǔ)言程序設計教程
豪杰V8添加快捷鍵
Sentinel驅動(dòng)模擬源碼
RichEdit 控件:語(yǔ)法高亮顯示
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久