4

私はアセンブリが初めてで、乱数の生成に問題があります。

私のコードは単純です。0-25範囲内の 100 個の数値を生成し、それらを配列に格納します。

私が経験している問題は、emu8086アセンブラーで con を実行すると、正常に実行され、配列に格納される 100 個の乱数が生成されることです。しかし、上で実行すると、masm6114 サイクルごとに新しい乱数が生成されます。つまり、配列内の値は 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

私のコードに問題がありますか? 何か追加する必要がありますか?ありがとう。

4

2 に答える 2

6

コードの主な問題は、乱数をまったく生成しないことです。システムクロックは乱数発生器ではないためです。私は、それは非常に非乱数ジェネレーターだと思います。

プログラムの開始後の最初の読み取りは、「ランダム」と見なすことができますが、プログラムをランダムな瞬間に手動で実行した場合に限ります。

次の数字はすべてランダムではありません。

このように、システム クロックから読み取った値は、(疑似) 乱数を生成するための他のアルゴリズムのシード (開始値) として使用するのに適しています。

乱数 (および疑似乱数) ジェネレーターは複雑なトピックであり、研究が必要です。少なくともwikipediaから始めてください。

ところで、トピック全体が複雑であるにもかかわらず、一部の乱数ジェネレーターは初心者のプログラマーが実装できるほど単純です。たとえば、middle-square-method。現在のシード AX をそれ自体で乗算し、結果の中間の 4 桁の 16 進数で次の数値を形成することにより、アセンブリ言語で実装してみてください。

; here ax contains the previous number

    mul ax
    mov al, ah
    mov ah, dl 

; here ax contains the next pseudo random number.
于 2016-02-23T19:22:04.343 に答える