我想通过运行exe一次生成5个随机数,范围从0到9。例如,我运行random.exe一次,我可以得到7,1,3,9,2。 我之前使用过以下代码,但是当你运行exe时,它只会随机化一次。
mov ah, 00h ; get current time
int 1ah ; cx:dx ---> clock count
mov ax, dx ; move low-order part of clock count to ax
xor dx, dx
mov cx, 10
div cx ; remainder goes to dx (ranges from 0-9)
; dx contains the randomized number
mov ax, dx
call printNum ; prints the contents of ax
我尝试将其置于循环中,但随机数(dx)不会发生变化。
答案 0 :(得分:0)
int 1ah
与ah(00)的结果表示滴答计数或时钟而不是CPU周期,因此,它每隔一段时间(例如,一些微秒)增加。这就是为什么即使你重复代码,它仍然比增量间隔快得多。rdtsc
可能是一个解决方案,它可以为您提供CPU周期。
rdtsc
的信息,您可以查看http://en.wikipedia.org/wiki/Time_Stamp_Counter。
答案 1 :(得分:0)
无论您使用哪个计数器,都无法使用任何定时计数器生成随机数。制作此类技巧的唯一方法是在数字生成之间引入人类可靠的暂停。实际上,第一个生成的数字或多或少是随机的。
因此,如果您需要五个数字,唯一的方法是使用一些伪随机算法并使用rdtsc
作为随机种子值。
这样的事情:
include "%lib%/freshlib.inc"
@BinaryType console
include "%lib%/freshlib.asm"
start:
InitializeAll
; get the seed:
rdtsc
xor eax, edx
mov ebx, eax ; the seed is in ebx
mov esi, 10
mov ecx, 50
; generate the numbers
.loop:
add ebx, $811C9DC5 ; prime 1
imul ebx, $01000193 ; prime 2
mov eax, ebx
xor edx, edx
div esi ; make it from 0 to 9
stdcall NumToStr, edx, ntsDec or ntsUnsigned
stdcall StrCharCat, eax, $0a0d
push eax
stdcall FileWriteString, [STDOUT], eax
stdcall StrDel ; from the stack
loop .loop
FinalizeAll
stdcall TerminateAll, 0
为了编译这个源代码,您将需要Fresh IDE或至少来自上述IDE和任何类型的FASM编译器的FreshLib库。