Генерация последовательности случайных чисел
Используя эти программы, можно получить последовательность случайных чисел, содержащую 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