📄 random.asm
字号:
;**************************************************
; 以下代码由“老罗代码着色器”0.2版进行着色
; 测试文件名:Random.asm
; 测试日期: 2002-12-29
;**************************************************
;*********************************************************
;程序名称:随机数的产生原理与实现
;作者:罗聪
;日期: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
;产生随机数:
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
;**********************************************************************
; 函数功能:产生范围从 first 到 second 的随机数
; 传入参数:
; first = 下限
; second = 上限
; 返回参数:
; eax = Rand_Number
; 所用公式:
; Rand_Number = (Rand_Seed * X + Y) mod Z
; 补充说明:
; (1)本例中用 GetTickCount 来取得随机数种子,
; 在实际应用中,可用别的方法代替。
; (2)要产生随机数,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 ; 修正产生的随机数的范围
mov eax, edx ; eax = Rand_Number
ret
iRand endp
end main
;******************** over ********************
;by LC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -