?? random.asm
字號:
;**************************************************
; 以下代碼由“老羅代碼著色器”0.2版進(jìn)行著色
; 測試文件名:Random.asm
; 測試日期: 2002-12-29
;**************************************************
;*********************************************************
;程序名稱:隨機(jī)數(shù)的產(chǎn)生原理與實現(xiàn)
;作者:羅聰
;日期:2002-11-21
;出處:http://www.LuoCong.com(老羅的繽紛天地)
;注意事項:如欲轉(zhuǎn)載,請保持本程序的完整,并注明:
;轉(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ù)種子,
; 在實際應(yīng)用中,可用別的方法代替。
; (2)要產(chǎn)生隨機(jī)數(shù),X和Y其中之一必須是素數(shù),
; 所以 X = 23, Y = 7(可用別的素數(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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -