我听说在Logical Congruential Generator算法中,我们应该使用之前生成的数字来生成新的数字。然而,我发现了下面这段代码:
MOV AH, 00h ; interrupt to get system timer in CX:DX
INT 1AH
mov [PRN], dx
call CalcNew ; -> AX is a random number
xor dx, dx
mov cx, 10
div cx ; here dx contains the remainder - from 0 to 9
add dl, '0' ; to ascii from '0' to '9'
mov ah, 02h ; call interrupt to display a value in DL
int 21h
call CalcNew ; -> AX is another random number
...
ret
; ----------------
; inputs: none (modifies PRN seed variable)
; clobbers: DX. returns: AX = next random number
CalcNew:
mov ax, 25173 ; LCG Multiplier
mul word ptr [PRN] ; DX:AX = LCG multiplier * seed
add ax, 13849 ; Add LCG increment value
; Modulo 65536, AX = (multiplier*seed+increment) mod 65536
mov [PRN], ax ; Update seed = return value
ret我看到它每次都使用系统时间,而不是以前的数字。我说的对吗?我正在使用TASM。
发布于 2021-06-22 23:32:39
CalcNew函数正确地使用了前一个种子。看看CalcNew:标签和ret之间的代码就知道了。
AH=0 / int 1AH + mov [PRN], dx是LCG的种子。
在整个程序中这样做一次,就像在代码中一样。
对于以后的调用,只需call CalcNew (并将结果处理到您想要的任何范围)。请注意,调用代码在第一次调用之前使用当前时间的低位作为种子,但总共进行了两次调用。它不会在它们之间重新播种。
https://stackoverflow.com/questions/68084105
复制相似问题