首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以下代码是否在汇编中实际实现了LCG算法?

以下代码是否在汇编中实际实现了LCG算法?
EN

Stack Overflow用户
提问于 2021-06-22 21:05:51
回答 1查看 49关注 0票数 1

我听说在Logical Congruential Generator算法中,我们应该使用之前生成的数字来生成新的数字。然而,我发现了下面这段代码:

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2021-06-22 23:32:39

CalcNew函数正确地使用了前一个种子。看看CalcNew:标签和ret之间的代码就知道了。

AH=0 / int 1AH + mov [PRN], dx是LCG的种子。

在整个程序中这样做一次,就像在代码中一样。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68084105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档