научное rnd (c) research/volgasoft

в уважаемом мною журнале spectrum expert были выложены как минимум все материалы для самостоятельного написания проволочного и даже залитого проволочного движка elite. теперь мы научимся генерировать псевдослучайные числа, а следовательно научимся писать все то, что происходит внутри станции (карта галактики и названия планет например: ). достаточно будет наскребать скромный материальчик по подобию искусственного интеллекта и каждый сможет написать элиту за два месяца:

основных методов генерации случайных чисел существует два (а ваще - один):
1) сдвиг числа с плавающей точкой (иногда с подмешиванием сдвинутых копий);
2) папский метод :) тык вот, рассмотрим папский метод:
n[i+1]=mod (a*n[i], z); - где mod = остаток от деления иными словами: следующее число=остаток от деления некой константы а, умноженной на предыдущее число и константы z. вот и все!

 на пальчиковом ассемблере: 
consta  equ 137
;z      equ 8
n       equ 3 ; начальное число

        ld ix, array;   адрес массива
        ld (ix),n
        ld de, consta;    константа а
        ld b,32;        сколько чисел генерировать
ll1
        ld l,(ix)
        ld h,0
        push de
        call mul_hl_de;  "a*n[i]"
        pop de
        ld (ix+1),l; остаток от деления на 256, он же младший байт
        inc ix
        djnz ll1

 ;готово

область значений генерируемых чисел зависит от констант. в примере z=256, a=137. значения z - выбирайте по вкусу (на самом деле в примере не мешало бы вначале сдвинуть результат умножения вправо на один бит, а потом брать остаток). значения а подбираются таким образом, чтобы распределение было близко к равномерному. как правило берутся <кривые> числа (забыл как их в школе звали которые делятся сами на себя и на единицу) такие, как 5, 7, 13, 17, 19, 23 и т.д. следите, чтобы не было нолей, иначе генератор встанет. как я уже говорил, чтобы числа получались не только четные или нечетные - поиграйте со сдвигами.

чтобы генерировать числа не только уложенные в заданное число бит (8 1..255, 7 - 1..127) придется гробить несколько чисел или использовать несколько генераторов, пример для чисел 1..191:

	ld a,n1
	and a,63
	ld c,a
	ld a,n2
	and a,127
	add a,c
	ld (result),a

ну а как генерировать названия планет в элите - знают все - берем, составляем массив из слогов (по две буквы) и заводим генератор - одно число соответствует одному слогу; и катаем двухбуквенные планеты, четырех, шести:

кстати, наподобие алгоритм используется при подсчете контрольных сумм, в том числе и у той же вг93.

ну вот и все: как тока расскажу про ии (или кто-нибудь расскажет на страницах adventurer 'a) с вас с каждого по элите :))).