九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
隨機(jī)數(shù)的產(chǎn)生原理與實(shí)現(xiàn)

隨機(jī)數(shù)的產(chǎn)生原理與實(shí)現(xiàn)

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

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

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

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

Rand_Number = (Rand_Seed * X + Y) mod Z

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

上面的這條公式就能滿足這兩點(diǎn)。至于為什么……呵呵,我也不懂,因?yàn)樗鼱可娴绞謴?fù)雜的數(shù)學(xué)求證過程,我們只需要知道如何應(yīng)用就成了:

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

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

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

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

iRand   proc uses ecx edx first:DWORD, second:DWORD
    invoke GetTickCount ; 取得隨機(jī)數(shù)種子,當(dāng)然,可用別的方法代替
    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 (余數(shù)在edx里面)
    add edx, first      ; 修正產(chǎn)生的隨機(jī)數(shù)的范圍
    mov eax, edx        ; eax = Rand_Number
    ret
iRand   endp

然后用以下語句調(diào)用:

invoke iRand, 1, 100

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

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

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

;**********************************************************************
; 函數(shù)功能:產(chǎn)生范圍從 first 到 second 的隨機(jī)數(shù)
; 傳入?yún)?shù):
;           first  = 下限
;           second = 上限
; 返回參數(shù):
;           eax = Rand_Number
; 所用公式:
;           Rand_Number = (Rand_Seed * X + Y) mod Z
; 補(bǔ)充說明:
;           (1)本例中用 GetTickCount 來取得隨機(jī)數(shù)種子,
;              在實(shí)際應(yīng)用中,可用別的方法代替。
;           (2)要產(chǎn)生隨機(jī)數(shù),X和Y其中之一必須是素?cái)?shù),
;              所以 X = 23, Y = 7(可用別的素?cái)?shù)代替)
;**********************************************************************
iRand   proc uses ecx edx first:DWORD, second:DWORD
    invoke GetTickCount ; 取得隨機(jī)數(shù)種子,當(dāng)然,可用別的方法代替
    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 (余數(shù)在edx里面)
    add edx, first      ; 修正產(chǎn)生的隨機(jī)數(shù)的范圍
    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

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

聯(lián)系客服