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

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

Используя эти программы, можно получить последовательность случайных чисел, содержащую 32 значения – это ее период. Чтобы увеличить период, необходимо каким-либо способом сгенерировать значения а или х, удовлетворяющие приведенным выше ограничениям. Так, значение а можно вычислить, используя фрагмент:

.data
:………
divider db 8
.code

Вычисляем а исходя из соотношения:

:а mod 8=5
:одним из способов получить значение а (т > а) удовлетворяем условию a mod 8 = 5
m2: mov al.a
xor ah,ah
div divider
cmp ah,5:остаток 5?
je ml
cmp ah,3:остаток 3?
je ml
inc a
jmp m2 ml:;теперь а найдено до конца

Изменить (увеличить) период можно, корректируя значение т, для чего необходимо будет исправить соответствующие команды в программах rand_mult_ cong_l.asm и rand_mult_cong_2.asm, ориентированные на определенную разрядность регистров. Существует другая возможность увеличения периода – использование смешанного конгруэнтного метода генерации последовательности случайных чисел.

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

Соотношение смешанного конгруэнтного метода выглядит так: Xn+1=(aXn+c) mod m, где n > 0.

При правильном подборе начальных значений элементов кроме увеличения периода последовательности случайных чисел уменьшается корреляция (зависимость) получаемых случайных чисел.

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

  • Х0>0;
  • а=21 +1, где 1>=2;
  • с>0 взаимно просто с m (это выполнимо, если с – нечетно, а т=2р, где (р>=2)
  • m=2р (р>=2) и т кратно 4.
:rand_mix_cong_l.asm – датчик линейной (смешанной)
:конгруэнтной последовательности случайных чисел (с>0).
:Вход: Хо. а. с .m – в соответствии с указанными выше ограничениями.
:Выход: dl – значение очередного случайного числа.
.data
m db 128; 128=27
a db 9
х db 3 начальное значение
с dw 3
.code
mov cl.7:значение степени m=27 в cl;первое число в последовательности х=3 cycl
: вычисляем очередное случайное число Х=(а*Х) mod m
mov al.x
mul a:a*x в ah:al
add ax,с
shrd ax.ax.cl
xor al.al
rol ax.cl:b al случайное число:вывод в файл – командная строка rand_mult_cong.exe > p.txt
end_cycl:

Величина периода случайной последовательности, получаемой с помощью данной программы, составляет 128 значений. Сегмент кода программы rand_mix_ cong_1.asm можно оформить в виде процедуры. Начальное значение Хо можно выбирать двумя способами: задавать константой в программе или генерировать случайным образом. В последнем случае можно использовать такты системного таймера, как в следующей макрокоманде:

rCMOS macro
;макрокоманда чтения значений CMOS
:на входе: al адрес ячейки, значение которой читаем
:на входе-выходе: al – прочтенное значение
out 70h,al
хоr ах,ах:вводим в регистр AL из порта значение ячейки cmos
in al.71h
endm.code
:получить значение секунд из CMOS для x_start mov al.00 rCMOS mov x.al:x=x_start
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.