Иллюстрированный самоучитель по задачам и примерам Assembler

Генерация последовательности случайных чисел

Мультипликативный конгруэнтный метод генерации последовательности случайных чисел

Мультипликативный конгруэнтный метод задает последовательность неотрицательных целых чисел Xj (Xj<m), получаемых по формуле:

Хn+1=аХn(mod m). (2)

На значения накладываются ограничения:

  • Хо – нечетно;
  • а=52р+1 (р=0, 1, 2,…) или a=2m +3 (m=3, 4, 5,…) – обе эти записи означают, что младшая цифра а при представлении а в восьмеричной системе счисления должна быть равна 3 или 5 (проще говоря, остаток от деления а/8 должен быть равен 3 или 5);
  • m=2 (1>4).

При соблюдении этих ограничений, длина периода будет равна m/4.

:randjnult_cong_l.asm – датчик линейной (мультипликативной)
:конгруэнтной последовательности случайных чисел (с=0).
:Вход: Хо .a, m – в соответствии с указанными выше ограничениями
:Выход: dl – значение очередного случайного числа.
.data
in db 128
a db 11
х db 3 начальное значение
.code
;первое число в последовательности х-3
cycl: moval.x вычисляем очередное случайное число Х=(а*Х) mod in
mul а:а*х в ah:al
divm;в ah случайное число
mov x.ah;вывод в файл – командная строка rand_mu1t_cong.exe > p.txt
mov dl.ah
mov ah.02
nit г"
jmp cyc1
end cycl:

Если m является степенью 2, как в данном случае, то вместо команды DIV можно использовать две команды сдвига.

;----------------------------------------------------------
;rand_mult_cong_2.asm – датчик линейной (мультипликативной) конгруэнтной последовательности
;случайных чисел (c=0).
;Вход: X0, a, m – в соответствие с указанными выше ограничениями.
;Выход: dl – значение очередного случайного числа.
;----------------------------------------------------------
masm
model small
.486
.data
m db 128;128=27
a db 11
x db 3;начальное значение
.stack 256
.486
.code
main:
mov dx,@data
mov ds,dx
xor dx,dx
mov cl,7;значение степени m=27 в cl
;первое число в последовательности x=3
cycl:
;вычисляем очередное случайное число X=(a*X) mod m
mov al,x
mul a;a*x в ah:al
shrd ax,ax,cl
xor al,al
rol ax,cl;в al случайное число
;вывод в файл – командная строка rand_mult_cong.exe > p.txt
mov x,al
mov dl,al
mov ah,02
int 21h
jmp cycl
end_cycl:
mov ax,4c00h
int 21h
end main
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.