Enterprise Forever

:HUN => Programozás => Topic started by: nyuzga on 2018.July.09. 19:02:38

Title: Randomize - véletlen szám generálása
Post by: nyuzga on 2018.July.09. 19:02:38
Egy játék ötlet. Gondol a gép egy számot 1-5-ig és ezt ki kell találni. Ezzel tesztelhetnénk a prekog képességeinket. :)

Tízből mennyit talál el valaki.
Title: Re:Randomize - véletlen szám generálása
Post by: szipucsu on 2018.July.10. 14:44:18
Gondol a gép egy számot 1-5-ig és ezt ki kell találni.

Code: [Select]
100 PROGRAM "GUESS.BAS"
110 RANDOMIZE
115 Z=0
120 FOR A=1 TO 10
130   LET X=RND(5)+1
140   INPUT PROMPT "Guess number "&STR$(A)&":" Y
150   IF X=Y THEN LET Z=Z+1:PRINT "Yes!"
155   IF X<>Y THEN PRINT "No. The number is:" X
157   PRINT "So far:" Z "numbers have been guessed." :PRINT
160 NEXT A
170 PRINT Z "times you guessed the number."
180 END

Szebben is meg lehetne írni, de szerintem elméletileg működik, ha nem szúrtam el semmit.
Title: Re:Randomize - véletlen szám generálása
Post by: IstvanV on 2018.July.10. 16:43:51
Elvileg elég sok szám után a többit már ki lehet találni programmal. :)
Title: Re:Randomize - véletlen szám generálása
Post by: szipucsu on 2018.July.10. 18:49:11
azért valamivel komolyabb programokra gondoltam ebben a topikban
Lehet írni a programhoz zenét, meg lehet csinálni attribútum, sőt gracha képernyősre. Toplistát is lehet csinálni, hangeffekteket ahhoz, amikor eltaláljuk a számot, és amikor nem találjuk el. :D
Amúgy a torpedó játék is majdnem ilyen. El kell találni, hova helyezte a gép a hajókat, csak jóval több a lehetőség. De mondjuk ha 2x2-es pályán kell egy hajót megtalálni, az majdnem olyan, mint ha 1 és 4 között kell kitalálni, mely számra gondolt a gép.
Title: Re:Randomize - véletlen szám generálása
Post by: endi on 2018.July.10. 19:17:39
tudjuk ügyebár, hogy a random függvég is csak egy ugyanolyan függvény mint a többi. a nagy kérdés ügye hogy hány biten ábrázolja a számot, és hogy az ember hány bites (ál-)random számot tud megjósolni. :)

ügyebár ha 1 bites a random szám akkor mindig a következő sorozatot kell hogy adja: 1 0 1 0 1 0 1 0. ez az ember el tudja találni :) :) :)

egy matematikus biztos meg tudná mondani, hogy 2, 3, 4 stb biteknél hogy jönnének. valszeg pár bit után már az ember nem tudna jól tippelni.

amúgy most olvastam egy híres kvantumfizikus könyvét, feymann önéletrajzát. abban ír egy marha érdekes dolgot. ügyebár ő jó volt matekból is, és munkája során sokat számoltak fejben, illetve egyszerű mechanikus számológéppel. na most neki akkora gyakorlata lett a különféle sin, cos, tangens meg ilyesmik fejből számolásával, hogy ezek felhasználásával statisztikai alapon jóval bonyolultabb függvényeket is ki tudott fejben számolni néhány tizedesjegyig! tehát azért, mert tudta hogy színusz 0.5 mennyi és nagyon sok ilyet, és sok hasonló függvényét, ezért ezeket az agya összekombinálta, és jóval komplexebb képletekben felhasználta. és persze mindenki csodálkozott hogy csinálja. (persze mindezt ő jobban leírta a könyben).
ja és úgy csinálta ezt hogy x idő alatt valamilyen pontosan kiszámolta, de ha még gondolkodott rajta akkor pontosabban :)
Title: Re:Randomize - véletlen szám generálása
Post by: szipucsu on 2018.July.10. 19:29:20
a random függvég
Valamelyik EP-s könyv feleslegesnek tartja egy programon belül többször is kiadni a RANDOMIZE parancsot, merthogy semmi értelme, de ha többször is betennénk pl. a FOR cikluson belülre a RANDOMIZÉt, akkor már nehezebb lenne kitalálni, milyen szám jön. De átlagember szerintem sose fogja tudatosan jól megtippelni 5-ből az 5 számót jól egymás után sokszor.
De nem muszáj a randomizén alapulnia az egésznek. Például a rendszeridőből is kiszámíthatja a véletlenszámot. És még a polinom számlálók éppen aktuális értékeit is beszámíthatja, a kettőt még kombinálhatja is. De befolyásolhatják még olyan dolgok is a véletlenszám generálását, hogy pl. a key click be van-e kapcsolva, mennyi a key rate, key delay, mennyi az órajel, mennyi memória/ramdisk/akármi van a gépben.
Title: Re:Randomize - véletlen szám generálása
Post by: Povi on 2018.July.11. 13:35:39
Például a rendszeridőből is kiszámíthatja a véletlenszámot.
Na de hát a RANDOMIZE pont ezt csinálja, nem? A rendszeridő (vagy a megszakítások száma alapján, de lényegében azt is felfoghatjuk rendszeridődek, mivel 50Hz-es számláló) alapján ad egy kezdőértéket a véletlenszám generátor függvénynek.
Title: Re:Randomize - véletlen szám generálása
Post by: szipucsu on 2018.July.11. 14:26:24
Na de hát a RANDOMIZE pont ezt csinálja, nem? A rendszeridő (vagy a megszakítások száma alapján, de lényegében azt is felfoghatjuk rendszeridődek, mivel 50Hz-es számláló) alapján ad egy kezdőértéket a véletlenszám generátor függvénynek.
Lehet. Nem tudom, mit csinál a randomize pontosan. De a programozó is kitalálhat többféle műveletet, hogy mit lehet csinálni a rendszeridővel és a megszakításokkal (pl. osztani, szorozni az értékeiket, gyököt vonni belőle, szinuszát venni, stb.) Ha mérné a gép a hőmérsékletet, azt is belevehetné a számításokba. Vagy a winchesterről beolvassa valamelyik fájlt, és valahányadik bájtját is beszámíthatja (floppynál jobb, mert azt gyakrabban cserélik). De ezeket biztos már ezerszer jobban kitalálták nálam. :D
Ha lenne net az EP-n, akkor a fórum utolsó hozzászóló nickjének a kezdőbetűjéből és a hozzászólás idejéből is számolhatna, amit még a rendszeridővel és megszakításokkal is összead/összeszoroz.
Title: Re: Randomize - véletlen szám generálása
Post by: IstvanV on 2018.July.11. 19:34:41
A RANDOMIZE a 23 bites véletlenszám generátor felső 7 bitjét az R regiszter alapján állítja be, az alsó 8 bitet pedig a RANDOM_IRQ EXOS változóból, aminek az értéke minden megszakításnál eggyel növekszik. A 8..15. bitet nem állítja, ha jól látom. BASIC program indításakor a generátor kezdőértéke 000211h.
Title: Re: Randomize - véletlen szám generálása
Post by: endi on 2018.July.11. 20:03:50
A RANDOMIZE a 23 bites véletlenszám generátor felső 7 bitjét az R regiszter alapján állítja be, az alsó 8 bitet pedig a RANDOM_IRQ EXOS változóból, aminek az értéke minden megszakításnál eggyel növekszik. A 8..15. bitet nem állítja, ha jól látom. BASIC program indításakor a generátor kezdőértéke 000211h.

trükkös :)
Title: Re: Randomize - véletlen szám generálása
Post by: IstvanV on 2018.July.11. 21:20:35
[attachurl=1]
[attachurl=2]
[attachurl=3]

Az rndguess program megpróbálja kitalálni a fenti BASIC programmal generált sorozat folytatását, a már ismert számokat kell a parancssorban megadni. Ezt meglehetősen kezdetleges módon oldottam meg, de az egyszerű generátor miatt ez is elfogadhatóan működik. Ha a seed után zárójelben 1-et ír ki, akkor a többi számot már elvileg biztosan jól jelzi előre. Ezt általában csak 7-8 szám után sikerül elérni.
Title: Re: Randomize - véletlen szám generálása
Post by: szipucsu on 2018.July.11. 21:41:59
Jé, véletlenül jól sikerült a basic programot összedobnom, én nem próbáltam ki egész eddig. :D Már ha nem javítottál bele hiba miatt.

Az rndguess.exe mivel nyílik meg?
Title: Re: Randomize - véletlen szám generálása
Post by: IstvanV on 2018.July.11. 22:22:06
Jé, véletlenül jól sikerült a basic programot összedobnom, én nem próbáltam ki egész eddig. :D Már ha nem javítottál bele hiba miatt.

Az INPUT PROMPT-nál volt egy szintaktikai hiba.

Quote
Az rndguess.exe mivel nyílik meg?

PC program.
Title: Re: Randomize - véletlen szám generálása
Post by: szipucsu on 2018.July.11. 22:37:41
Az INPUT PROMPT-nál volt egy szintaktikai hiba.
Gondolkodtam, kell-e oda pontosvessző vagy valami, de furán mutatott. Tehát kettőspont kell. Lehetne a programon szépíteni valamit? Pl. a két IF-et összevonni, vagy hasonló, ami programozásilag elegánsabb?

Quote
PC program.
Hogy kell elindítani? Windows-on dupla kattintással nem indult el, meg dos-os .bat fájlból sem sikerült elindíteni.
Title: Re: Randomize - véletlen szám generálása
Post by: nyuzga on 2018.July.12. 13:08:16
(Attachment Link)

Köszönöm. 3 a csúcsom. :)
Title: Re: Randomize - véletlen szám generálása
Post by: IstvanV on 2018.July.12. 13:11:18
Hogy kell elindítani? Windows-on dupla kattintással nem indult el, meg dos-os .bat fájlból sem sikerült elindíteni.

Parancssoros program. Példa:
[attachthumb=1]

rndguess.exe 3 5 5 2 3 1 1 3
seed = 0x7199 (1)

3
5
5
2
3
1
1
3
3*
4


Tehát itt már biztosan 3 és 4 az utolsó két szám:
[attachthumb=2]
Title: Re: Randomize - véletlen szám generálása
Post by: IstvanV on 2018.July.12. 13:23:20
A program egyébként nem különösebben hasznos, de a forráskódban látható az IS-BASIC 2.1 véletlenszám generátorának a pontos működése. Az aktuális állapotot (a forráskódban rnd_state) a 0246h, 0247h és 0211h címeken tárolja (alsó->felső byte). A kiírt "seed" érték felső 7 bitje az R Z80 regiszter, az alsó 8 bit pedig a RANDOM_IRQ EXOS változó a RANDOMIZE utasítás futásakor.
Title: Re: Randomize - véletlen szám generálása
Post by: nyuzga on 2018.July.12. 13:31:01
Köszönöm. 3 a csúcsom. :)

Egyre jobb vagyok. :)
[attach=1]
Title: Re: Randomize - véletlen szám generálása
Post by: nyuzga on 2018.July.12. 13:47:23
https://www.youtube.com/watch?v=4OIpAr7xGBM

Neki nem kell számítógép. :D
Title: Re: Randomize - véletlen szám generálása
Post by: szipucsu on 2018.July.12. 18:32:55
Egyre jobb vagyok. :)
Na, ha tudtam volna, hogy ekkora sikere lesz ennek a programnak, teszek bele hangeffekteket, zenét, és színes attribútum képernyőn futna.

Tehát itt már biztosan 3 és 4 az utolsó két szám:
Ez érdekes. Ha 20, 50 vagy 100 számot kéne eltalálni, akkor is az első 8 után már tudná, mi lesz az összes többi?
Title: Re: Randomize - véletlen szám generálása
Post by: IstvanV on 2018.July.12. 18:53:27
Ez érdekes. Ha 20, 50 vagy 100 számot kéne eltalálni, akkor is az első 8 után már tudná, mi lesz az összes többi?

Igen. Akkor változna, ha nem 1 és 5 közötti számok lennének. Mivel a RANDOMIZE 32768 lehetséges kezdőértéket tud beállítani, elvileg 7 számra van szükség (log5(32768) = 6.46), de a gyakorlatban valamivel többre.
Title: Re: Randomize - véletlen szám generálása
Post by: endi on 2018.July.12. 18:58:54
amúgy amikor a random music generátort írtam, sokat hallgattam a random zenéket, és az EP randomszám generátorának eredménye mindenféle dologra (hangmagasság, ütem stb) és mindenféle korlátozásra (hogy mekkora random számot kérek le) egy felismerhető, megjegyezhető mintázatot ad. szóval a "zenei" agyi részem felismeri ezt.

na persze mindez csak úgy igaz, hogy nincs kiadva randomize, azaz az alaphelyzetből keletkező random sorozatra :)

de igazából ha az ember zseni vagy olyan autista, aki tud zseniálisan számolni, lehet, hogy már-már misztikus módon vissza tudja fejteni a random generátor függvényt, és így előre kitalálni a számokat :)
Title: Re: Randomize - véletlen szám generálása
Post by: IstvanV on 2018.July.14. 16:10:40
Még egy érdekesség, Spectrumon így működik az RND (a % az osztás maradéka):

seed = ((seed + 1) * 75) % 65537 - 1

Ez viszonylag jó megoldás, de csak 16 bites az állapot, tehát 65536 szám után ismétlődik a sorozat. A RANDOMIZE itt is az aktuális időt, azaz pontosabban a 16 bites megszakítás számlálót használja.
Title: Re: Randomize - véletlen szám generálása
Post by: Povi on 2019.January.16. 17:39:09
próbálkozom az István féle random függvénnyel a wallpipe játékban:
Code: [Select]
random:     ld   hl, 0x7fff                 ; * random seed
            ld   a, r
            xor  l
            add  hl, hl
            xor  h
            ld   l, a
            xor  h
            ld   h, a
            ld   (random + 1), hl
            ret

van egy 16 elemű táblázatom, ahol a lehetséges formák vannak letárolva:
rnd_table: db  1, 2, 3, 4, 5, 6, 7, 8, 9, 7, 6, 5, 4, 3, 2, 1

vagyis a 8-as és 9-es fele olyan arányban kéne jönni, mint a többi (1-7) elemnek

az random függvény eredményét 16-tal osztom, és ez alapján olvasom ki a táblázatból az értéket

sajnos nem igazán egyenletes az elemek eloszlása, van, hogy egy-egy elem csak nagyon soká jön.

Van-e olyan random fv., ahol ez az eloszlás egyenletesebb? pl. 64 "húzás" után legyen 3-5 db.  az 1-7 elemekből, és 1-3 db. a 8-as 9-esből?
Title: Re: Randomize - véletlen szám generálása
Post by: IstvanV on 2019.January.16. 17:53:53
sajnos nem igazán egyenletes az elemek eloszlása, van, hogy egy-egy elem csak nagyon soká jön.

Lehet, hogy ez csak véletlenül fordult elő, de az probléma, ha következetesen mindig ugyanaz az elem ritka. Mivel a függvény az R regisztert is használja, elvileg az is ronthatja a kimenet minőségét, ha a hívások időzítése nem szerencsés. A sebesség mennyire fontos?
Title: Re: Randomize - véletlen szám generálása
Post by: geco on 2019.January.16. 17:56:49
próbáld meg, hogy and 0fh esetén milyen lesz a végeredmény a 16-tal való osztás helyett, amúgy nekem a felvetésedre egy bonyolultabb megoldás jutott csak eszembe.
Az hogy tárold el az értékeket két helyen, ha az 1-7 eléri az 5 elemet, akkor már csak 8-9-et fogadjon el, ha betelik a 8-9 3 eleme, akkor csak 1-7-et, bármi más esetben jók vagyunk.
Title: Re: Randomize - véletlen szám generálása
Post by: IstvanV on 2019.January.16. 18:04:36
A Xorgame zene lejátszója így választ legfeljebb 8 zene közül:

Code: C
  1. static unsigned char    tune_cnt;
  2. static unsigned char    current_tune = 0;
  3. static unsigned char    rnd_tune_weights[8] = {
  4.   30, 30, 30, 30, 30, 30, 30, 30
  5. };
  6.  
  7. static unsigned char get_random_tune(void)
  8. {
  9.   unsigned char n = rnd8(tune_cnt * 30 - 1, 255);
  10.   unsigned char s = 0;
  11.   unsigned char i, j;
  12.   if (tune_cnt < 2)
  13.     return 0;
  14.   for (i = 0; i < tune_cnt; i++) {
  15.     s = s + rnd_tune_weights[i];
  16.     if (n < s)
  17.       break;
  18.   }
  19.   n = i;
  20.   s = rnd_tune_weights[n];
  21.   rnd_tune_weights[n] = 0;
  22.   j = s / (unsigned char) (tune_cnt - 1);
  23.   s = s - (j * (unsigned char) (tune_cnt - 1));
  24.   for (i = 0; i < tune_cnt; i++) {
  25.     if (i == n)
  26.       continue;
  27.     if (s > 0) {
  28.       rnd_tune_weights[i] += (j + 1);
  29.       s--;
  30.     }
  31.     else {
  32.       rnd_tune_weights[i] += j;
  33.     }
  34.   }
  35.   return n;
  36. }

Ugyanaz a zene nem fordulhat elő kétszer egymás után, és a régebben játszottaknak nagyobb a valószínűsége.
Title: Re: Randomize - véletlen szám generálása
Post by: Povi on 2019.January.16. 22:14:45
Lehet, hogy ez csak véletlenül fordult elő, de az probléma, ha következetesen mindig ugyanaz az elem ritka. Mivel a függvény az R regisztert is használja, elvileg az is ronthatja a kimenet minőségét, ha a hívások időzítése nem szerencsés. A sebesség mennyire fontos?
A sebesség nem annyira fontos. Lehet, hogy az R regiszert csak a seed feltöltéséhez kéne használnom?
Title: Re: Randomize - véletlen szám generálása
Post by: Povi on 2019.January.16. 22:16:38
Ugyanaz a zene nem fordulhat elő kétszer egymás után, és a régebben játszottaknak nagyobb a valószínűsége.
Az nem fontos, hogy ne legyen egymás után ugyanaz a két érték, inkább az eloszlás a problémás.
Title: Re: Randomize - véletlen szám generálása
Post by: Povi on 2019.January.16. 22:18:14
próbáld meg, hogy and 0fh esetén milyen lesz a végeredmény a 16-tal való osztás helyett
Először azzal próbáltam, azzal se volt túl jó, de aztán valahol azt olvastam, hogy szerencsésebb inkább a 16-tal osztás, ezért maradt így, persze ez nyilván algoritmus függő is.
Title: Re: Randomize - véletlen szám generálása
Post by: IstvanV on 2019.January.16. 22:35:33
Ha a teljesen egyenletes eloszlás a fontos, akkor talán célszerűbb lenne a generálandó számoknak megfelelő méretű táblázatot 0 és 15 közötti értékekkel egyszerű növekvő sorrendben feltölteni, és utána a táblázatból véletlenszerű címről választani a következő elemet, amelynek a helyére az utolsó kerül, és a táblázat mérete eggyel csökken:
Code: C
  1. extern unsigned int rnd(unsigned int range);
  2.  
  3. #define RND_TABLE_SIZE 400
  4.  
  5. static unsigned char rnd_table[RND_TABLE_SIZE];
  6. static unsigned int rnd_left = 0;
  7.  
  8. void rnd_table_init(void)
  9. {
  10.   unsigned int  i;
  11.   for (i = 0; i < RND_TABLE_SIZE; i++)
  12.     rnd_table[i] = i & 15;
  13.   rnd_left = RND_TABLE_SIZE;
  14. }
  15.  
  16. unsigned char rnd_table_next(void)
  17. {
  18.   unsigned int  n;
  19.   unsigned char c;
  20.   if (!rnd_left)
  21.     return 0xFF;
  22.   n = rnd(rnd_left);
  23.   c = rnd_table[n];
  24.   rnd_table[n] = rnd_table[--rnd_left];
  25.   return c;
  26. }
Title: Re: Randomize - véletlen szám generálása
Post by: Povi on 2019.January.17. 10:40:24
Ha a teljesen egyenletes eloszlás a fontos, akkor talán célszerűbb lenne a generálandó számoknak megfelelő méretű táblázatot 0 és 15 közötti értékekkel egyszerű növekvő sorrendben feltölteni, és utána a táblázatból véletlenszerű címről választani a következő elemet, amelynek a helyére az utolsó kerül, és a táblázat mérete eggyel csökken:

Hm... köszi, kipróbálom!
Title: Re: Randomize - véletlen szám generálása
Post by: IstvanV on 2019.January.18. 13:11:45
Elvileg jobb minőségű, de lassabb véletlenszám generátor rutinok. Ezeken valószínűleg még lehetne javítani és optimalizálni.
Code: ZiLOG Z80 Assembler
  1. ; A = RND(0..255)
  2.  
  3. random:
  4. .l1:    ld      hl, 7fffh               ; *
  5. .l2:    ld      a, l
  6.         add     hl, hl
  7.         xor     h
  8.         ld      l, a
  9.         xor     h
  10.         ld      h, a
  11.         ld      (.l1 + 1), hl
  12.         ld      c, l
  13. .l3:    ld      hl, 68ach               ; *
  14. .l4:    ld      b, 24h                  ; *
  15.         ld      a, h
  16.         ld      (.l4 + 1), a
  17.         ld      a, b
  18.         ld      b, l
  19.         add     hl, hl
  20.         xor     h
  21.         rla
  22.         ld      l, a
  23.         ld      a, b
  24.         rra
  25.         rlca
  26.         ld      h, a
  27.         ld      (.l3 + 1), hl
  28.         add     a, c
  29.         xor     l
  30.         ret
  31.  
  32. randomize:
  33.         ld      bc, 0027h               ; RANDOM_IRQ
  34.         exos    16
  35.         ld      l, d
  36.         ld      a, r
  37.         and     7fh
  38.         ld      h, a
  39.         or      l
  40.         jr      nz, random.l2
  41.         dec     hl
  42.         jr      random.l2
  43.  
  44. ; L = A = RND(0..L-1)
  45.  
  46. rnd8:
  47.         dec     l
  48. .l1:    ld      e, l
  49.         ld      d, l
  50.         ld      a, e
  51.         rra
  52.         or      e
  53.         ld      e, a
  54.         rra
  55.         srl     a
  56.         or      e
  57.         ld      e, a
  58.         rra
  59.         rra
  60.         rra
  61.         rra
  62.         and     0fh
  63.         or      e
  64.         ld      e, a
  65. .l2:    call    random
  66.         and     e
  67.         ld      l, a
  68.         ld      a, d
  69.         cp      l
  70.         jr      c, .l2
  71.         ld      a, l
  72.         ld      h, 0
  73.         ret
  74.  
  75. ; HL = BC = RND(0..HL-1)
  76.  
  77. rnd16:
  78.         dec     hl
  79.         ld      e, l
  80.         ld      d, h
  81.         ld      a, d
  82.         or      a
  83.         jr      nz, .l1
  84.         ld      a, e
  85. .l1:    ld      e, a
  86.         rra
  87.         or      e
  88.         ld      e, a
  89.         rra
  90.         srl     a
  91.         or      e
  92.         ld      e, a
  93.         rra
  94.         rra
  95.         rra
  96.         rra
  97.         and     0fh
  98.         or      e
  99.         ld      e, a
  100.         and     d
  101.         jr      z, .l2
  102.         ld      d, e
  103.         ld      e, 0ffh
  104. .l2:    push    hl
  105.         call    random
  106.         and     d
  107.         push    af
  108.         call    random
  109.         pop     bc
  110.         and     e
  111.         ld      c, a
  112.         pop     hl
  113.         ld      a, l
  114.         cp      c
  115.         ld      a, h
  116.         sbc     a, b
  117.         jr      c, .l2
  118.         ld      l, c
  119.         ld      h, b
  120.         ret
Title: Re: Randomize - véletlen szám generálása
Post by: IstvanV on 2019.January.19. 12:17:59
de aztán valahol azt olvastam, hogy szerencsésebb inkább a 16-tal osztás

Ez az algoritmustól függ, az itt használtaknál nem igazán számít, de PC-n gyakori ez a megoldás:

  y[n] = (y[n - 1] * a + b) % c

ahol c sokszor 2 hatványa, például 2^32, mert azzal nagyon egyszerű és gyors lehet a kód, x86 CPU-n a szorzás egy utasítással elvégezhető, a % műveletet pedig az eredmény 32 bitesre csonkítása automatikusan megoldja. Így azonban az alsó N bit legfeljebb 2^N hosszúságú sorozatot ismételhet, ez könnyen belátható, mivel szorzásnál és összeadásnál az alsó bitek nem függhetnek a felsőktől. Jobb minőségű megvalósításnál a c prímszám, lehetőleg Mersenne szám, azaz 2 hatványánál eggyel kevesebb, például 0x7FFFFFFF, így már nincs különbség a bitek véletlenszerűsége között.
Title: Re: Randomize - véletlen szám generálása
Post by: endi on 2019.January.19. 18:10:40
vajon az ilyen régi gépekben miért nem használtak táblázatot a random szám generálásának gyorsításához? szerintem mondjuk egy 256 elemű táblázat használatával egyszerűbb és gyorsabb generáló kód készíthető. 256 bájt meg nem sok, nem foglalt volna sokat.
Title: Re: Randomize - véletlen szám generálása
Post by: geco on 2019.January.19. 18:15:31
vajon az ilyen régi gépekben miért nem használtak táblázatot a random szám generálásának gyorsításához? szerintem mondjuk egy 256 elemű táblázat használatával egyszerűbb és gyorsabb generáló kód készíthető. 256 bájt meg nem sok, nem foglalt volna sokat.
Speccyn előszeretettel használták a ROM-ot táblázatként :D
Title: Re: Randomize - véletlen szám generálása
Post by: endi on 2019.January.19. 18:29:25
Speccyn előszeretettel használták a ROM-ot táblázatként :D

ja, ez is jó ötlet. össze xor-ozni egy "zajosabb" kis táblázat adataival, és elég jó eredménye lehet. legalábbis játékokhoz bővel elég
Title: Re: Randomize - véletlen szám generálása
Post by: Zozosoft on 2019.January.19. 18:46:58
Speccyn előszeretettel használták a ROM-ot táblázatként :D
Aztán ebből lesznek olyanok, mint pl a Monte Carlo Casino EP átiratában mindig 0 jön ki a ruletten...
Title: Re: Randomize - véletlen szám generálása
Post by: IstvanV on 2019.January.19. 18:47:42
Speccyn előszeretettel használták a ROM-ot táblázatként :D

Jól használható lehet ilyen célra tömörített adat is, ha a játék egyébként is tartalmaz ilyet, különösen a nagy méretű, m0 formátumú blokkok amikben az adat eredetileg sem volt túl egyszerű (pl. sok egymás után ismétlődő 0).

De külön véletlenszám táblázat általában nem igazán éri meg, legfeljebb ha nagyon fontos a sebesség, például grafikai célú használatnál. És ez a rutin (https://enterpriseforever.com/programozas/randomize-veletlen-szam-generalasa/msg74007/#msg74007) is csak néhány utasítás, ami nem nagy különbség a táblázat olvasáshoz képest, és nem ismétlődik a kimenet 256 byte után. Még a fenti "bonyolultabb" random rutin is csak 38 byte, és CALL/RET utasítással együtt 193 ciklus alatt fut le, ami a programtól függően elfogadható lehet.
Title: Re: Randomize - véletlen szám generálása
Post by: endi on 2019.January.19. 18:54:55
a gyorsaság mindig számít :)
sőt, csak az számít :)