我是汇编新手,在生成随机数时遇到问题。
我的代码很简单:它在中生成 100 个数字0-25
范围并将它们存储在数组中。
我遇到的问题是,当我在emu8086
汇编程序成功运行并生成 100 个随机数,并将其存储在数组中。但是当我在masm611
,每4个周期生成一个新的随机数。这意味着数组中的值是 4 个值的连续相同数字,然后存储下一个随机值。
这是我的代码:
.model small
.stack 100h
.data
range db 25
i db 0 ;iterator
arr db 15 dup(0) ; an array
.code
mov ax,@data
mov ds,ax
mov bx,offset arr ;getting the adress of the arr in bx
L1:
mov ah,2ch
int 21h
mov ah,0
mov al,dl ;using dl by seeing 2ch details
div range ; so the number is in range
mov [bx],ah ;ah has remainder as using 8 bits div and
inc bx ;moving to the next index
inc i
cmp i,100
jbe L1
mov ah,4ch ;returning control
int 21h
end
我的代码有问题吗?我需要添加一些东西吗?谢谢。
您的代码的主要问题是它根本不生成随机数。因为系统时钟不是随机数发生器。我想说,它是非常非随机的数字生成器。
程序启动后的第一次读取仍然可以被视为“随机”,但前提是您在随机时刻手动运行程序。
接下来的所有数字都不是随机的。
这样,从系统时钟读取的值适合用作生成(伪)随机数的某些其他算法的种子(起始值)。
随机(和伪随机)数生成器是一个复杂的主题,需要一些研究。至少开始于维基百科 https://en.wikipedia.org/wiki/Pseudorandom_number_generator.
顺便说一句,尽管整个主题很复杂,但一些随机数生成器足够简单,可以由初学者程序员实现。例如中平方法 https://en.wikipedia.org/wiki/Middle-square_method。尝试用汇编语言实现它,将当前种子 AX 与其自身相乘,并用结果的中间 4 个十六进制数字形成下一个数字:
; here ax contains the previous number
mul ax
mov al, ah
mov ah, dl
; here ax contains the next pseudo random number.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)