Может у кого есть процедуры
1 - генератор случайных чисел, генерящий число в заданном 8bit диапазоне.
выдающий разные числа даже при первом обращении
2 - процедура деления 16bit/8bit=16bit остаток не важен
Вид для печати
Может у кого есть процедуры
1 - генератор случайных чисел, генерящий число в заданном 8bit диапазоне.
выдающий разные числа даже при первом обращении
2 - процедура деления 16bit/8bit=16bit остаток не важен
1. пользовал процу из какойто книженции. помойму "как написать игру на ассемблере", посмотри мож подойдет.
2: http://www.zxdn.narod.ru/coding/bd22divd.txt
По rnd здесь.
вот. выдрано из beta basic
Добавлено через 13 минутКод:rand_ ld d,0
ld bc,(rnd)
ld h,c
ld l,#fd
ld a,b
or a
sbc hl,bc
sbc a,d
sbc hl,bc
sbc a,d
ld e,a
sbc hl,de
jr nc,r1
inc hl
r1 ld (rnd),hl
ret
rnd dw 0
процедура деления по модулю вместе с процедурой вызова рандомайзера. на входе в А указываешь максимальное число диапазона в котором нужно получить рнд. на выходе рнд от нуля до макс..
Код:mod ld a,16
ld hl,0
m0 rl e
rl d
rl l
rl h
sbc hl,bc
jr nc,m1
add hl,bc
m1 ccf
dec a
jr nz,m0
ret
rand push af
call rand_
pop af
ld c,a
ld b,0
ex de,hl
call mod
ld a,l
ret
PHP код:
вот моя 16 бит
; rnd = seed*5+1
seed: LD HL,0
LD D,H
LD E,L
ADD HL,HL
ADD HL,HL
ADD HL,DE
INC HL
LD (SEED+1),HL ; hl = rnd
Raider, старший байт какой-то не особо случайный получается. Таким образом если использовать её например для заполнения экрана то придётся в 2 раза больше раз её выполнять.
Всё-же ИМХО вариант из beta basic предпочтительнее (сам я использую что-то типа его.)
От туда очень понравился вариант
Просто элегантное решение.Код:RND 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
смотря как ты заполняешь. просто байтом?
совершенно особая ситуация возникает если приходится ставить множество случайных точек на экран, генерации X, а затем Y. Вот там-то быстро можно увидеть, какой RND генератор "настоящий". Попробуйте, кстати для эксперимента. Увлекательнейшее дело.
генераторы основанные на принципе "сдвиг и xor" дают случайный бит. их используют для шума. но такие генераторы дают очень плохой случайный байт.
в линейном конгруэнтном датчике псевдо-случайной последовательности, что определяется формулой X[n+1] = (X[n] * A) mod B + C
наиболее "шумят" старшие биты. наименее - младшие.
* - это обычное умножение, A следует брать любым, но жел-но таким что остаток от денения его на 4 дает 1.
mod - операция взятия остатка от деления. (здесь получается B = 65536)
+ сложение. C следует брать любым, всегда нечетным
Добавлено через 4 минуты
а вот еще фокус для экспериментаторов с RND.
если взять как случайное число сумму случайных чисел, скажем 3-4 и более, то у данной последовательности изменяется мат.ожидание, меняется распределение.
оно меняется от uniform (чистый белый шум) например на triangular.
а такой шум звучит иначе.
для 1-битной пищалки можно попытаться складывать биты. тоже будет изменение тембра шума.
вот эта процедура на 100% эмулирует рандом из ПЗУ
Цитата:
sub_random
push de,bc,af
ld de,0
seed equ $-2
xor a
ld h,a,l,a,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 (seed),hl
pop af,bc,de
ret