Oldal: 1 / 2
Véletlen szám generálás
Elküldve: 2015.10.19. 16:53
Szerző: Bali
Miközben kitettem a hogyan programozzunk Spectrum játékot 4. fejezetét került elő ez a véletlenszám generálás téma.
Kód: Egész kijelölése
; Egyszerű pszeudo-véletlen szám generátor.
; Egy mutatót léptet a ROM területen (a seed-ben tárolva), visszaadva
; a megcímzett bájt tartalmát.
random ld hl, (seed) ; Mutató
ld a, h
and 31 ; Az első 8 KB-on belül tartjuk
ld h, a
ld a, (hl) ; "Véletlen" szám a mutatott helyről
inc hl ; Mutató léptetése
ld (seed), hl
ret
seed defw 0
A cikkben említett példát elkészítettem:
- pelda_4_1.zip
- Véletlen szám generálás
- (2.07 KiB) Letöltve 49 alkalommal.
Egyrészt kérdezem, hogy kinek mi a véleménye erről a módszerről illetve milyen jobb módszert ajánlanátok erre a feladatra.
Re: Véletlen szám generálás
Elküldve: 2015.10.19. 17:05
Szerző: z0d
Re: Véletlen szám generálás
Elküldve: 2015.10.19. 17:46
Szerző: makranc
Bali írta:Egyszerű pszeudo-véletlen szám generátor.
...
Egyrészt kérdezem, hogy kinek mi a véleménye erről a módszerről illetve milyen jobb módszert ajánlanátok erre a feladatra.
Annak idején olvastam (talán egy lottószám-generáló program kapcsán), hogy úgy próbáltak pszeudo helyett valódit létrehozni, hogy egy ciklusban folyamatosan generált ál-véletlen számokból egy gombnyomás pillanatában létrejött számot használtak fel.
Re: Véletlen szám generálás
Elküldve: 2015.10.19. 18:12
Szerző: Laki
Miért, mi a gond a Spectrum Basic ROM-ban található véletlenszám generátor rutinjával?
Másrészt emlékeim szerint valahogyan az időből (TIME) is szokás volt véletlenszámot generálni, igaz nem Spectrumon.
Latyi.ca
Re: Véletlen szám generálás
Elküldve: 2015.10.19. 19:05
Szerző: z0d
Szerintem a TIME-ot csak seed-eléshez használják.
@Bali: kicsit utánaolvasok a témának, rég volt már, hogy ilyesmivel foglalkoztam és írok bővebben. : - )
Re: Véletlen szám generálás
Elküldve: 2015.10.20. 12:43
Szerző: mezei
Bali írta:Miközben kitettem a hogyan programozzunk Spectrum játékot 4. fejezetét került elő ez a véletlenszám generálás téma..
Alapvetően sok helyen biztos kitűnően alkalmazható, főleg mikor sok számot kell generálni elég gyorsan és zökkenőmentesen, lehet kicsit bolondítani pl. az első gombnyomásig eltelt idővel, stb.
Az Ishido-nál ki is próbáltam, de nem volt annyira véletlenszerűen véletlenszerű

, ha lehet egyáltalán így fogalmazni, mint az itt találhatók:
https://chuntey.wordpress.com/2012/06/0 ... enerators/
Ezek azért jóval több processzoridőt elvisznek, de a minőségre áldozni kell

Re: Véletlen szám generálás
Elküldve: 2015.10.20. 21:16
Szerző: Asimo
Hali!
A ROM-mal nekem három bajom van:
- Nem járja be a teljes értéktartományt
- Nem egyenletes eloszlású a értékek halmaza
- A ROM-ban vannak hosszú azonos értékek (pl. sok egymást követő 0xFF)
Ezek miatt tűnhet a "játékos" számára nem teljesen váletlenszerűnek az eredmény.
Szerintem nézzétek meg a z88dk-ban implementált megoldást. Egyszerűnek és rövidnek tűnik.
A seed pedig mehet a FRAMES rendszerváltozóból (0x5C78, 3 byte, 20ms-ként növekszik az értéke).
Üdv,
Re: Véletlen szám generálás
Elküldve: 2015.10.20. 21:39
Szerző: Asimo
Találtam egy egyszerű megoldást:
http://www.z80.info/pseudo-random.txt
Ebben a videóban pedig hivatkozást egy gyors és látványosan jó megoldásra:
https://www.youtube.com/watch?v=WiTLxV4UDe8
Az első függvény:
Kód: Egész kijelölése
ld a, (seed)
ld b, a
rrca
rrca
rrca
xor 0x1f
add a, b
sbc a, 255
ld (seed), a
ret
Ennek eredményt pedig átküldték az álábbi a funkción:
Kód: Egész kijelölése
ld hl, #0xABCD
xor a
rr h
rr l
jr nc, end
ld a, h
xor #0xF7
ld h, a
ld a, l
xor #0xFB
ld l, a
end:
ld (seed+1), hl
ret
A kommenteket szándékosan kihagytam, mert így látható mennyire rövid (és így gyors) a kód. Az eredeti oldalakon ott van minden részlet.
https://github.com/lronaldo/cpctelera/t ... src/random
https://github.com/lronaldo/cpctelera/b ... src/main.c
Re: Véletlen szám generálás
Elküldve: 2015.10.20. 22:24
Szerző: Asimo
Laki írta:Miért, mi a gond a Spectrum Basic ROM-ban található véletlenszám generátor rutinjával?
Nagyon lassú. A Basic lebegőpontos kalkulátorát használja. 0-1 közötti lebegőpontos számot ad eredményül, amivel további lebegőpontos szorzást is kell még végezni.
Re: Véletlen szám generálás
Elküldve: 2015.10.20. 23:36
Szerző: Zozosoft
; Egyszerű pszeudo-véletlen szám generátor.
; Egy mutatót léptet a ROM területen (a seed-ben tárolva), visszaadva
; a megcímzett bájt tartalmát.
Na ez viccelt meg minket némely EP-re átírt programban!
Konkrétan a Monte Carlo Casino című programban volt, hogy a ruletten csak 0 jött ki, ami erősen rontotta a játék élvezeti értékét

Én jöttem rá, hogy a nullás lapot fel kell tölteni valami bájt szeméttel, és akkor megjavul, ha jól emlékszem még az Enterpress-be is beküldtem a javítást.