PDA

Просмотр полной версии : RND



GM BIT
23.06.2010, 03:39
Дайте генератор RND без использования ПЗУ

Такой конечно хороший, но не подходит
rnd ld a,3
ld c,a
add a,a
add a,a
add a,c
inc a
ld (rnd+1),a

Barmaley_m
23.06.2010, 04:56
Вот один из самых простых и быстрых методов:

http://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_% D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1 %82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0% B4

tiboh
23.06.2010, 16:25
Вот хороший генератор

RND LD A,53
ADD A,A
JR NC,$+5
LD C,51
XOR C
LD (RND+1),A

Можно доработать, добавив строки:

LD C,A
LD A,R
XOR C

Sinus
23.06.2010, 18:25
я обычно такой использую:



rnd: ld a,42
ld hl,rnd_tab

dup rnd_tab_last - rnd_tab
add a,(hl)
ld (hl),a
inc hl
edup

ld (rnd+1),a
ret

rnd_tab:
db 'asdGK'
rnd_tab_last:


чем длиннее таблица, тем более случайные будут числа (но и тем медленней будет работать)

GM BIT
08.09.2010, 09:36
Собрал в кучку, общими усилиями

RND_8 LD A,3
LD C,A
ADD A,A
ADD A,A
ADD A,C
INC A
LD (RND_8+1),A
RET

;---------------------------------------------------------------

RND_8 LD A,53
ADD A,A
JR NC,$+5
LD C,51
XOR C
; LD C,A
; LD A,R
; XOR C
LD (RND_8+1),A
RET

;---------------------------------------------------------------

RND_8 LD A,42
LD HL,RND_TAB
DUP 5
ADD A,(HL)
LD (HL),A
INC HL
EDUP
LD (RND_8+1),A
RET
RND_TAB DB 'as^GK'

;---------------------------------------------------------------

RND_8 LD A,(R1)
LD D,A
LD A,(R2)
LD (R1),A
ADD A,D
LD D,A
LD A,(R3)
LD (R2),A
ADD A,D
RLCA
LD (R3),A
RET
R1 DEFB 200
R2 DEFB 71
R3 DEFB 153

;---------------------------------------------------------------

RND_32 LD HL,0
LD A,H
AND #3F
LD H,A
LD D,(HL)
INC HL
LD E,(HL)
INC HL
LD A,(HL)
XOR D
XOR E
SUB 16
LD B,A
LD A,D
AND 3
LD D,A
LD E,B
LD (RND_32+1),HL
RET

;---------------------------------------------------------------

RND_32 LD HL,#FFFF
LD A,H
ADD HL,HL
XOR H
ADD HL,HL
ADD HL,HL
ADD HL,HL
XOR H
ADD HL,HL
ADD HL,HL
XOR H
ADD HL,HL
ADD HL,HL
LD L,A
LD (RND_32+1),HL
RET

;---------------------------------------------------------------

RND_32 LD HL,0
LD A,H
ADD A,#77
LD H,A
RLC L
ADD A,L
LD L,A
LD (RND_32+1),HL
RET

;---------------------------------------------------------------

RND_32 LD HL,#FFFF
LD A,H
OR L
JR NZ,NOZERO
INC L
NOZERO LD A,L
RLCA
XOR H
RLCA
RLCA
XOR H
RLCA
XOR H
RLCA
ADC HL,HL
LD (RND_32+1),HL
RET

;---------------------------------------------------------------

RND_32 LD HL,0
LD D,H
LD E,L
ADD HL,HL
ADD HL,HL
ADD HL,DE
INC HL
LD (RND_32+1),HL
RET

;---------------------------------------------------------------

Процедура ПЗУ

RND_32 LD DE,0
XOR A
LD H,A
LD L,A
LD B,A
ADD HL,DE
ADC A,B
DUP 3
ADD HL,HL
ADC A,A
EDUP
ADD HL,DE
ADC A,B
DUP 2
ADD HL,HL
ADC A,A
EDUP
ADD HL,DE
ADC A,B
ADD HL,HL
ADC A,A
ADD HL,DE
ADC A,B
SUB #4A
NEG
LD C,A
ADD HL,BC
LD (RND_32+1),HL
RET

;---------------------------------------------------------------

Sinus
14.09.2010, 23:09
ещё бы тесты, какое выдаёт более рандомное распределение (например, поставить 1000 точек по рандому на экране) и как по скорости (примерно, по бордру, вызвав функцию раз 100).