gpt4 book ai didi

assembly - 在x86 8086 Assembly中生成0-9范围内的随机数

转载 作者:行者123 更新时间:2023-12-04 11:39:29 26 4
gpt4 key购买 nike

首先,我对8086汇编非常陌生,因此很难掌握这些知识。不过,我会尽力而为。

我一直在尝试编写代码以生成0-9范围内的随机数。在研究了几个示例和建议之后,我最终得出了这一结论。为了简单起见,我没有对检索到的时钟计数应用任何数学函数,并且我认为这是不必要的。由于某种原因,我最终生成的数字比1,3和9的数字少一些,例如6,7。迅速。

我的目的是模拟一个骰子掷骰子,该掷骰子后来将以下代码的范围更改为1-6。
我的问题是,这足以满足我的目的吗?还是有更好的方法来做到这一点?

代码:

RANDGEN:        ; generate a rand no using the system time
RANDSTART:
MOV AH, 00h ; interrupts to get system time
INT 1AH ; CX:DX now hold number of clock ticks since midnight
; lets just take the lower bits of DL for a start..
MOV BH, 57 ; set limit to 57 (ASCII for 9)
MOV AH, DL
CMP AH, BH ; compare with value in DL,
JA RANDSTART ; if more, regenerate. if not, continue...

MOV BH, 49 ; set limit to 48 (ASCII FOR 0)
MOV AH, DL
CMP AH, BH ; compare with value in DL
JB RANDSTART ; if less, regenerate.


; if not, this is what we need
mov ah, 2h ; call interrupt to display a value in DL
int 21h
RET

答案,@ johnfound:

我发现他的方法更简单,并且花费更少的时间来生成随机数。他提到只有当您需要一个随机数,或者随机数之间的间隔包括人为输入的停顿时,此方法才有效。如果不是这样,这些数字将根本不会是随机的(我相信由于我们最初采取的时间种子不会改变)。对于我的情况,这是很好的,因为我正在模拟掷骰子,并且在再次运行代码之前需要用户干预(另一个掷骰子)。
RANDGEN:         ; generate a rand no using the system time
RANDSTART:
MOV AH, 00h ; interrupts to get system time
INT 1AH ; CX:DX now hold number of clock ticks since midnight

mov ax, dx
xor dx, dx
mov cx, 10
div cx ; here dx contains the remainder of the division - from 0 to 9

add dl, '0' ; to ascii from '0' to '9'
mov ah, 2h ; call interrupt to display a value in DL
int 21h
RET

他做了什么:
1.我们将DX中的值移至AX
2.我们清除了DX。
3.我们将12月10日移至CX。
4.我们将AX除以CX,因此得到12月0-9日的余数,该余数存储在DX中。5.最后,我们在DX中添加了ASCII'0'(dec 48),从而将它们转换为ASCII'0'至'9' 。

最佳答案

仅当您需要一个随机数或随机数之间的间隔包括人工输入的暂停时,此技巧才有效。在所有其他情况下,这些数字根本不会是随机的。

如果需要许多随机数,那么可以使用不同的伪随机数算法。

另一个要注意的是,有一种更简单的方法可以在所需的时间间隔内获取数字:

    mov  ax, dx
xor dx, dx
mov cx, 10
div cx ; here dx contains the remainder of the division - from 0 to 9

add dl, '0' ; to ascii from '0' to '9'

您当然可以对每个随机数生成器使用此方法。

关于assembly - 在x86 8086 Assembly中生成0-9范围内的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17855817/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com