RND
Moderator: Shaos
-
- Junior
- Posts: 7
- Joined: 28 Mar 2003 23:38
RND
Люди расскажите как мона заделать быстрый RND чисел 1 - 4 или 0-3 ???
-
- Fanat
- Posts: 78
- Joined: 11 Jul 2002 05:28
- Location: Минск
Может поможет.
От себя лишь добавлю, что число N можно взять из Регистра регенерации памяти, LD A,R
Статья из ADVENTURER 13

От себя лишь добавлю, что число N можно взять из Регистра регенерации памяти, LD A,R
Статья из ADVENTURER 13
Code: Select all
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) с вас с каждого по элите
:))).
Удачи!
-
- Novelist
- Posts: 27
- Joined: 20 Jan 2003 03:51
-
- Fanat
- Posts: 78
- Joined: 11 Jul 2002 05:28
- Location: Минск
А вот ещё лучше:
Имеет хорошее равномерное распределение.
В первой строке начальное число.
Code: Select all
;на выходе в HL число 0..#FFFF
RND LD DE,0
LD A,77
CALL MUL
INC HL
LD (RND+1),HL
RET
MUL LD HL,0
MULTS AND A
RET Z
RRA
JR NC,$+3
ADD HL,DE
SLA E
RL D
JP MULTS
В первой строке начальное число.
Удачи!