Другие языки программирования и технологии

MASM32 случайные числа, , массив

есть проц. RandomRange -генерирует случайное целое в указанном диапазоне от 0 до n-1. Ей передается в р-ре EAX число n. Сгенериное число возвр-ся также в EAX

ещё есть Random - генерирует в диапазоне от 0 до ffffffffh, которое возвр-ся в EAX ;

Мне надо за пихать в массив 50 случайных значений в диапазоне -20 ...+20 .

в диапазоне от 0 до +20 это можно с помощью RandomRange, не догоняю как -20? Думаю задать массив с эттим диапазоном и сравнивать со сгенерированным числом, , если то что надо то каойнибудь счетчик+1 пока не станет 50..и т. д

всвязи с этим вопрос, , а как задать такой массив и каким образом сравнивать EAX(в нём рандом) с тем элементом.

вообщем я запутался

спасибо
Не нужно ничего ни с чем сравнивать. Просто генерируйте числа от 0 до 40 и вычитайте из них 20.

Пример генерации массива из 50 случайных чисел от -20 до 20:

.586
.model flat, c
option casemap :none

includelib msvcrt.lib

printf proto :dword, :vararg
_getch proto
_exit proto :dword

.const
  ArrayLen = 50

.data
  Frmt db "%5d", 0
  Prompt db 13, 10, 10, "Для завершения работы нажмите любую клавишу... ", 0

.data?
  Seed dd ?
  Array dd ArrayLen dup (?)

.code
N169171421:
    rdtsc
    mov Seed, eax
    mov ecx, ArrayLen
    mov edi, offset Array
@@:
    push ecx
    mov eax, 41
    call RandomRange
    sub eax, 20
    stosd
    invoke printf, addr Frmt, dword ptr [edi - 4]
    pop ecx
    loop @B

    invoke printf, addr Prompt
    invoke _getch
    invoke _exit, 0

RandomRange proc uses edx
    mov edx, eax
    imul eax, Seed, 08088405h
    inc eax
    mov Seed, eax
    mul edx
    mov eax, edx
    ret
RandomRange endp
    end N169171421

Пример выполнения программы:


P.S. В русском языке нет слова "вообщем".
Эльдар Шукуров
Эльдар Шукуров
51 590
Лучший ответ
представь результат, как целое со знаком (в дополнительном коде, т. е. ffffffffh = -1), нужна дробная часть примени масштабирование (только точка будет двоичной, а не десятичной: 1/2, 1/4, 1/8 ...), т. е. затем представь как число с фиксированной запятой
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
random_seed dd ?
res dd 0
sFmt db '%u',0DH,0AH,0
sBuf db 10 dup(0)


.code

Random proc dwBase:dword
push ebx
mov eax,dwBase
xor ebx,ebx
imul edx,random_seed,08088405h
inc edx
mov random_seed,edx
mul edx
mov eax,edx
pop ebx
ret
Random endp

Randomize proc
invoke GetTickCount
mov random_seed,eax
ret
Randomize endp

start:
invoke Randomize
invoke Random,7fffffffh
mov res,EAX
invoke wsprintf,ADDR sBuf,ADDR sFmt,res

invoke MessageBox,0,ADDR sBuf,0,0
invoke ExitProcess,0
Василий Гончаров Примерно так генерируются случайные числа. А вот с массивом сам разберись)

Похожие вопросы