Welcome, Guest. Please login or register.


Author Topic: Randomize - véletlen szám generálása (Read 2615 times)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4806
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 58.0 Firefox 58.0
    • View Profile
Re: Randomize - véletlen szám generálása
« Reply #15 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:
21519-0

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:
21521-1

Offline IstvanV

  • EP addict
  • *
  • Posts: 4806
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 58.0 Firefox 58.0
    • View Profile
Re: Randomize - véletlen szám generálása
« Reply #16 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.

Offline nyuzga

  • EP addict
  • *
  • Posts: 2112
  • Country: hu
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Firefox 61.0 Firefox 61.0
    • View Profile
Re: Randomize - véletlen szám generálása
« Reply #17 on: 2018.July.12. 13:31:01 »
Köszönöm. 3 a csúcsom. :)

Egyre jobb vagyok. :)
21523-0

Offline nyuzga

  • EP addict
  • *
  • Posts: 2112
  • Country: hu
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Firefox 61.0 Firefox 61.0
    • View Profile
Re: Randomize - véletlen szám generálása
« Reply #18 on: 2018.July.12. 13:47:23 »
https://www.youtube.com/watch?v=4OIpAr7xGBM

Neki nem kell számítógép. :D

Offline szipucsu

  • EP addict
  • *
  • Posts: 8068
  • Country: hu
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Firefox 61.0 Firefox 61.0
    • View Profile
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: Randomize - véletlen szám generálása
« Reply #19 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?
SOUND SOURCE 3,STYLE 16,LEFT 16,RIGHT 64,SYNC 2
SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 2
SOUND PITCH 25,SYNC 2
Videos

Offline IstvanV

  • EP addict
  • *
  • Posts: 4806
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 58.0 Firefox 58.0
    • View Profile
Re: Randomize - véletlen szám generálása
« Reply #20 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.

Offline endi

  • EP addict
  • *
  • Posts: 7305
  • Country: hu
  • grafikus, játékfejlesztõ, programozás, scifi, tudományok, vallás
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Chrome 67.0.3396.87 Chrome 67.0.3396.87
    • View Profile
    • Honlapom
Re: Randomize - véletlen szám generálása
« Reply #21 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 :)
Vigyázat! Szektás vagyok! :)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4806
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 58.0 Firefox 58.0
    • View Profile
Re: Randomize - véletlen szám generálása
« Reply #22 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.

Offline Povi

  • EP addict
  • *
  • Posts: 1873
  • Country: hu
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Chrome 71.0.3578.98 Chrome 71.0.3578.98
    • View Profile
    • http://povi.fw.hu
Re: Randomize - véletlen szám generálása
« Reply #23 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?
*** Speicherplatz zu klein

Offline IstvanV

  • EP addict
  • *
  • Posts: 4806
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 58.0 Firefox 58.0
    • View Profile
Re: Randomize - véletlen szám generálása
« Reply #24 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?

Online geco

  • EP addict
  • *
  • Posts: 5430
  • Country: hu
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Firefox 64.0 Firefox 64.0
    • View Profile
Re: Randomize - véletlen szám generálása
« Reply #25 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.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4806
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 58.0 Firefox 58.0
    • View Profile
Re: Randomize - véletlen szám generálása
« Reply #26 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.

Offline Povi

  • EP addict
  • *
  • Posts: 1873
  • Country: hu
  • OS:
  • Linux Linux
  • Browser:
  • Chrome 70.0.3538.77 Chrome 70.0.3538.77
    • View Profile
    • http://povi.fw.hu
Re: Randomize - véletlen szám generálása
« Reply #27 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?
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 1873
  • Country: hu
  • OS:
  • Linux Linux
  • Browser:
  • Chrome 70.0.3538.77 Chrome 70.0.3538.77
    • View Profile
    • http://povi.fw.hu
Re: Randomize - véletlen szám generálása
« Reply #28 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.
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 1873
  • Country: hu
  • OS:
  • Linux Linux
  • Browser:
  • Chrome 70.0.3538.77 Chrome 70.0.3538.77
    • View Profile
    • http://povi.fw.hu
Re: Randomize - véletlen szám generálása
« Reply #29 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.
*** Speicherplatz zu klein