Сборник по задачам и примерам Assembler


Аддитивный генератор случайных чисел



Аддитивный генератор случайных чисел

Генератор, формирующий очередное случайное число в соответствии с отношением (3), называется аддитивным:

Xn+1=(Xn+Xn-k) mod m. (3)

В трехтомнике Кнута [5] обсуждаются подобные генераторы и рекомендован следующий вариант формулы (3):

Xn+1=(Xn-24+Xn-55) mod m.(4)

Здесь n > 55, m=21, Хо, ..., Х54 — произвольные числа, среди которых есть и нечетные. При этих условиях длина периода последовательности равна 21-1 (255-1).

Для генерации первых 55 случайных чисел можно использовать один из рассмотренных выше генераторов. Возьмем датчик линейной (смешанной) конгруэнтной последовательности случайных чисел (с > 0).

;rand_add.asm - аддитивный генератор случайных чисел.

:Вход: :Х0. а. с. m ;

случайная последовательность длиной 55 значений, получаемая с помощью

программы генерации высокослучайных двоичных наборов (см. rand_mix_cong_1.asm); :N=700 - количество элементов в последовательности + 1; :L=7 - значение степени т=27. ¦.Выход: dl - значение очередного случайного числа.

.data

N=700 количество элементов в последовательности + 1

L=7 :L - значение степени т=2

т db 128 ;128=27

mm dw 256 ; 256=28

a db 9

с dw 3

;массив значений х (начальное значение х=3) длиной N+1

х db 3, N dup (Offh)

;.........

.code

:далее фрагменты из rand_mix_cong_l.asm.

хог si,si

mov ecx.54 :счетчик цикла для формирования начальной последовательности

:первое число в последовательности х=3

mov al ,x

cycl: вычисляем очередное случайное число Х=(а*Х) mod m

mul a ;а*х в ah:al

add ax.с

shrd ax.ax.L:L - значение степени т=27

хог al.al

rol ax.L ;в al случайное число

:вывод в массив х и файл - командная строка rand_mult_cong.exe > p.txt

i nc si

mov x[si].al

mov dl.al

mov ah. 02

int 21h

loop cycl

:далее продолжаем формирование случайной последовательности, но уже аддитивным методом

mov ecx,N-55

cycl 2: incsi

хог dx.dx

mov al.x[si-24]

mov dl.x[si-55]

add ax.dx

хог dx.dx

div mm

mov x[si].dl

mov ah.02

int 21h
loop eye 12
exit:

Судя по результатам, этот метод достаточно хорош. В частности, он неплох тем, что позволяет задавать длину последовательности без оглядки на значение т.




- Начало -  - Назад -  - Вперед -