微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

下面的代码是否真的在汇编中实现了LCG算法

如何解决下面的代码是否真的在汇编中实现了LCG算法

我听说在逻辑同余生成器算法中,我们应该使用我们之前生成的数字来生成一个新的数字。但是,我发现了以下代码

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。

解决方法

CalcNew 函数正确使用了先前的种子。只需查看 CalcNew: 标签和 ret 之间的代码。

AH=0 / int 1AH + mov [PRN],dx 是 LCG 的种子。
在整个程序中执行一次,就像在代码中一样。

对于以后的调用,只需 call CalcNew(并将结果处理为您想要的任何范围)。请注意,调用代码在第一次调用之前使用当前时间的低位作为种子,但总共进行了两次调用。它不会在它们之间重新播种。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。