RND

Старый спектрумистский форум

Moderator: Shaos

Budnikov Alex
Junior
Posts: 7
Joined: 28 Mar 2003 23:38

RND

Post by Budnikov Alex »

Люди расскажите как мона заделать быстрый RND чисел 1 - 4 или 0-3 ???
Aprisobal
Fanat
Posts: 78
Joined: 11 Jul 2002 05:28
Location: Минск

Post by Aprisobal »

Может поможет. :-?

От себя лишь добавлю, что число 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) с  вас  с каждого по элите
:))).
Удачи!
moroz1999
Novelist
Posts: 27
Joined: 20 Jan 2003 03:51

Post by moroz1999 »

можно сделать еще проще -

ld a,r
and 3

далеко не всегда и далеко не идеально рэндомно,но, по-моему этот способ самый быстрый. Иногда его, правда, зацикливает:)
Aprisobal
Fanat
Posts: 78
Joined: 11 Jul 2002 05:28
Location: Минск

Post by Aprisobal »

А вот ещё лучше:

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
Имеет хорошее равномерное распределение.
В первой строке начальное число.
Удачи!