научное 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) с вас с каждого по элите :))).