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





Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Программы - CAD+3D PLOT. Векторный графический редактор.
ZXNet - О введенном пароле в сети ZXNet.
Смайлик - У Вас глисты есть?

В этот день...   23 октября