Véletlen szám generálás

Z80 assembly programozáshoz hasznos ötletek, megoldások...
Avatar
Bali
Site Admin
Hozzászólások: 1895
Csatlakozott: 2012.01.06. 13:34
Tartózkodási hely: Budapest III.
Kapcsolat:

Véletlen szám generálás

Hozzászólás Szerző: Bali » 2015.10.19. 16:53

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 6 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.
-= Bali =-
(c) 1983-2017 Evil-Soft

z0d
Speccyalista
Hozzászólások: 30
Csatlakozott: 2012.01.09. 14:30

Re: Véletlen szám generálás

Hozzászólás Szerző: z0d » 2015.10.19. 17:05


Avatar
makranc
Speccyalista
Hozzászólások: 242
Csatlakozott: 2012.01.11. 11:00
Tartózkodási hely: Budapest, III.

Re: Véletlen szám generálás

Hozzászólás Szerző: makranc » 2015.10.19. 17:46

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.

Laki
Speccyalista
Hozzászólások: 20
Csatlakozott: 2012.01.08. 23:06
Tartózkodási hely: Budapest

Re: Véletlen szám generálás

Hozzászólás Szerző: Laki » 2015.10.19. 18:12

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

z0d
Speccyalista
Hozzászólások: 30
Csatlakozott: 2012.01.09. 14:30

Re: Véletlen szám generálás

Hozzászólás Szerző: z0d » 2015.10.19. 19:05

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. : - )

Avatar
mezei
Speccyalista
Hozzászólások: 380
Csatlakozott: 2012.01.06. 14:52

Re: Véletlen szám generálás

Hozzászólás Szerző: mezei » 2015.10.20. 12:43

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 :)
fanzix.hu

Avatar
Asimo
Speccyalista
Hozzászólások: 147
Csatlakozott: 2012.01.09. 18:49

Re: Véletlen szám generálás

Hozzászólás Szerző: Asimo » 2015.10.20. 21:16

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,

Avatar
Asimo
Speccyalista
Hozzászólások: 147
Csatlakozott: 2012.01.09. 18:49

Re: Véletlen szám generálás

Hozzászólás Szerző: Asimo » 2015.10.20. 21:39

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

Avatar
Asimo
Speccyalista
Hozzászólások: 147
Csatlakozott: 2012.01.09. 18:49

Re: Véletlen szám generálás

Hozzászólás Szerző: Asimo » 2015.10.20. 22:24

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.

Avatar
Zozosoft
Speccyalista
Hozzászólások: 726
Csatlakozott: 2012.01.06. 14:03
Kapcsolat:

Re: Véletlen szám generálás

Hozzászólás Szerző: Zozosoft » 2015.10.20. 23:36

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

Válasz küldése

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég