Adventurer
#13
31 марта 2002 |
|
Обмен опытом - ненаучный алгоритм получения Случайных Чисел (RND).
(C) Research/Volgasoft Научное RND В уважаемом мною журнале 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) с вас с каждого по элите :))).
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября