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 29 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.