gpt4 book ai didi

assembly - 在汇编中生成随机数

转载 作者:行者123 更新时间:2023-12-02 21:39:59 27 4
gpt4 key购买 nike

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

我的代码很简单:它生成 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/

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