Véletlen szám generálás

Assembly programozáshoz hasznos kódok
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.21. 00:14

mezei írta: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 :)
A hivatkozott oldalon található két link WoS-os fórumra. Mindkettő algoritmust Patrik Rak jegyzi.
A rövidebb algoritmust kipróbáltam, és abszolut győztes. Ténylegesen felveszi az összes értéket.
A végére betettem két sort, hogy Basic-ből ki lehessen próbálni.

Kód: Egész kijelölése

        ORG 45000
        
        rnd    
        ld  hl,0xA280   ; xz -> yw
        ld  de,0xC0DE   ; yw -> zt
        ld  (rnd+1),de  ; x = y, z = w
        ld  a,e         ; w = w ^ ( w << 3 )
        add a,a
        add a,a
        add a,a
        xor e
        ld  e,a
        ld  a,h         ; t = x ^ (x << 1)
        add a,a
        xor h
        ld  d,a
        rra             ; t = t ^ (t >> 1) ^ w
        xor d
        xor e
        ld  h,l         ; y = z
        ld  l,a         ; w = t
        ld  (rnd+4),hl
        ld  b,0        ; basic miatt
        ld  c,a        ; basic miatt
        ret
A Basic próba:

Kód: Egész kijelölése

10    PLOT USR 45000/2, USR 45000/2
20    GO TO 10
A képen látható, hogy alig maradt ki pixel, szinte minden lehetséges értéket felvett:
Patrik_Rnd.png
Patrik Rak pseudo random number generator
Összehasonlításul itt a Basic saját RND függvénye. Bármeddig futtatjuk, nem változik a kép, ilyen függőleges csíkok maradnak.
Basic_Rnd.png
Spectrum Basic RND
A Basic RND teszt:

Kód: Egész kijelölése

10    PLOT RND*128,RND*128
20    GO TO 10
A topik indító ROM rutin is elég rossz eredményt hozott, ahogy vártuk:
Rom_Rnd.png
Using Spectrum ROM as PRNG source
Korábban beidéztem a Fast RND algoritmust a z80.info oldalról. Szemmel láthatóan önmagában használhatatlan:
Fast_Rnd.png
Fast RND algorithm
Kiegészítve a CPC Telera oldalon található algoritmussal, sokkal jobb eredményt kapunk, de nem olyan jót, mint Patrik kódjával.
Cpc_Rnd.png
CPC Telera PRNG algorithm
A CPC Telera algoritmus tesztelése:

Kód: Egész kijelölése

	org 48000

rnd:
   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 (rnd+1), hl

rnd2:
   ld   a,0
   ld   c,a
   xor  l
   rrca
   rrca
   rrca
   xor  0x1F
   add  c
   sbc  0xFF
   ld   (rnd2+1),a

   ld   b,0  ; basic miatt
   ld   c,a  ; basic miatt

   ret
A tesztek alapján egyértelműen Patrix Rak kódját használnám játékokban...

Avatar
Bali
Site Admin
Hozzászólások: 1753
Csatlakozott: 2012.01.06. 13:34
Tartózkodási hely: Budapest III.
Kapcsolat:

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

Hozzászólás Szerző: Bali » 2015.10.21. 11:17

Köszi Asimo, asszem ez kimerítő válasz volt. :)
-= Bali =-
(c) 1983-2017 Evil-Soft

Avatar
Bali
Site Admin
Hozzászólások: 1753
Csatlakozott: 2012.01.06. 13:34
Tartózkodási hely: Budapest III.
Kapcsolat:

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

Hozzászólás Szerző: Bali » 2015.10.21. 11:28

Nézegettem ezt a Patrik féle nyertes algoritmust, de a kommentek se értettem, úgyhogy kicsit ráguggoltam a témára, ezt találtam, ezzel kicsit érthetőbb talán, legalábbis a kommentek. :)

Xorshift:
https://en.wikipedia.org/wiki/Xorshift
-= Bali =-
(c) 1983-2017 Evil-Soft

csaba
Speccyalista
Hozzászólások: 158
Csatlakozott: 2012.01.09. 19:18
Rádióamatőr hívójel: HG5BMU
Tartózkodási hely: Surány
Kapcsolat:

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

Hozzászólás Szerző: csaba » 2015.10.22. 08:46

Komolyabb feladatra igazi véletlenszámhoz természetesen hardware kell.
pl. egy analóg zajgenerátor- egy zener dióda jelét felerősítve és digitalizálva.
legjobb a valós áramkör, de ezt a jelet eltárolva kellő hosszban is megfelelő lehet.
Érdekes lenne a fenti teszttel megnézni egy ilyen forrást.

Esetleg analóg fm rádió állomás nélküli zaja a mic bemenetre kötve.

Válasz küldése

Ki van itt

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