assembly - 在汇编中生成随机数

标签 assembly random x86 masm emu8086

我是汇编新手,在生成随机数时遇到问题。

我的代码很简单:它生成 100 个 0-25 范围内的数字并将它们存储在一个数组中。

我遇到的问题是,当我在 emu8086 汇编器上运行 con 时,它成功运行并生成 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

我的代码有问题吗?我需要添加一些东西吗?谢谢。

最佳答案

您的代码的主要问题是它根本不生成随机数。因为系统时钟不是随机数发生器。我想说,它是非常非随机的数字生成器。

程序启动后的第一次读取仍然可以被视为“随机”,但前提是您在随机时刻手动运行程序。

接下来的所有数字都不是随机的。

这样,从系统时钟读取的值适合用作生成(伪)随机数的其他算法的种子(起始值)。

随机(和伪随机)数生成器是复杂的主题,需要一些研究。至少从 wikipedia 开始.

顺便说一句,尽管整个主题很复杂,但一些随机数生成器足够简单,可以由初学者程序员实现。例如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.

关于assembly - 在汇编中生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35583343/

相关文章:

assembly - 将 IEEE 浮点十六进制转换为十进制?

c++ - 类成员偏移地址不正确

c - RDTSC 和系统调用、sys_read 和 sys_write

linux - 计算条件跳转

linux - 比较 nasm 中的 16 位数字会产生错误的结果

c - mmap 替代 malloc

algorithm - 随机 1 对 1 哈希函数

c++ - 如何将随机整数转换为均匀的实数 [0,1[ 分布

c - C的rand()有哪些常用算法?

assembly - asm中的ADC指令