Skandináv lottó demóprogram

Skandináv lottó (heteslottó) demóprogramot tervezünk és írunk meg Java nyelven. Lépésenként mutatja meg, hogy mi történik a háttérben: hogyan állítja elő véletlenszerűen a lottószelvényt.

Az emlékezet egy logikai tömb. Ebben 36 elem van. A nulladik elem nem számít, és legyen a többi elem (1-35-ig indexelve) kezdetben mind hamis. A cél: legyen a tömbben pontosan 7 db igaz érték. Másképpen: a logikai tömb a lottószelvényen megjátszható számok kiválasztottságát jelöli, igen vagy nem. A heteslottó-szelvény 7 db 1 és 35 közötti különböző egész számból áll.

Mindig 1 és 35 közötti egész véletlenszámot tippelünk. Kezdetben jóSzámDb=0. Az első tipp biztosan jó és jóSzámDb=1. A többi tipp esetén vizsgálni kell, hogy már kiválasztott-e. Ha igen, akkor nincs teendőnk. Ha nem, akkor meg kell jegyezni (kiválasztottá kell tenni, azaz igazzá kell állítani a logikai tömbben) és a jóSzámDb++ (növelhető). Mindezt ciklusban ismételjük, amíg a jóSzámDb<7 feltétel teljesül (másképpen: amíg nincs elegendő kiválasztott szám a szelvényen). Mindez biztosítja az egyediséget, különbözőséget. Ha jóSzámDb==7, akkor kiírjuk a lottószelvényre kerülő számokat az alapján, hol (melyik indexen) van a logikai tömbben igaz érték.

Tekintsük át az alkalmazott módszer hátrányait és előnyeit. Hátrány, hogy 36 logikai érték szükséges ahhoz, hogy 7 különböző számot előállítsunk. Előny, hogy egyszerű az algoritmus (nem kell keresés és megszámolás programozási tétel) és nincs szükség rendezésre sem, mert a szakterületre jellemző „emelkedő számsorrend” a logikai tömb bejárásával önkéntelenül is adódik. Hangsúlyozzuk, hogy ez csupán egyetlen módszer a nagyon sok izgalmas közül, amikkel generálható egy véletlenszerű lottószelvény.

A megvalósítás, Java forráskód nagy egyszerű. Íme egy függvény, amely visszaadja azt kiválasztottságot jelölő logikai tömböt, amiből megfelelően indexelve kiíratható a véletlenszerűen generált lottószelvény:

Egy demóprogram, szimulációs program, oktatóprogram esetén nem is a konkrét feladat megoldása a cél/probléma. Sokkal inkább a lépésenkénti bemutatás, sok-sok konzolos kiírással vagy grafikus szemléltetéssel. Sokszor időzítővel késleltetjük, lassítjuk, gyorsítjuk a folyamatot, de előfordul az is, hogy rengetegszer megismételjük a tevékenységet és a kapott adatokat elemezzük, következtetünk belőlük. Most például a ciklust ki kell cserélni olyan léptetésre, ami a felhasználó kattintásához kötődik. Ha kéri a következő tippet a lottószelvényre, akkor megkapja. Ha nem kattint, akkor nem kapja meg. Az is egy csalás/lehetőség lenne, hogy a háttérben nem is logikai tömb adatszerkezet van, csupán a vizualizáció miatt tűnik annak.

Az elkészült demóprogram megvalósítja a fenti algoritmust. Az alábbi képernyőképeken végiglapozható a demóprogram működése. Nem is az algoritmus megvalósítása a kihívás és a cél, hanem a folyamat lépésenkénti megjelenítése. Java swing grafikus felület készült el.

 

A demóprogram Start állapottal indul. Olyan a lépésenként tesztesetek sorozata, hogy a lottószelvény nem sikerül rögtön elsőre. Az egyik szám már előfordult korábban. A demóprogram Stop állapottal ér véget. A demóprogram pénztárszalagszerűen időnként jelzi, hol tart éppen. A demóprogram képes egymás után több lottószelvényt is előállítani és az emlékezete egyetlen szelvényre korlátozódik.

A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

A Java SE szoftverfejlesztő tanfolyamunkon, a szakmai modul Objektumorientált programozás témakörét követő 29-36. óra Grafikus felhasználói felület alkalmain már tudunk egyszerűbb szimulációs programot tervezni, kódolni, tesztelni. A Java EE szoftverfejlesztő tanfolyamunkon, a szakmai modul 33-40. óra Java Server Pages alkalmain már a program böngészőben futó változatát is el tudjuk készíteni.

“Skandináv lottó demóprogram” bejegyzéshez 6 hozzászólás

  1. Funkcionálisan sikerült összehozni egy skandináv lottószelvényt:
    System.out.println(IntStream.rangeClosed(1, 35).boxed().sorted((a, b)->Math.random()<0.5?1:-1).limit(7).sorted().collect(Collectors.toList()));

    Válasz
    • Helyes a megoldásod András. Hogy Neked is – és a haladóknak is – legyen benne kihívás, hasonlítsd össze ezzel a megoldással:
      System.out.println(Stream.iterate(1, i->i+1).limit(35).sorted((a, b)->Math.random()<0.5?1:-1).limit(7).sorted().collect(Collectors.toList()));
      és próbáld megmagyarázni a különbségeket, ahogyan egy állásinterjún is előfordulhatna. Folytassuk az ILIAS-ban.

      Válasz
  2. Nekem a kedvenc lottós példám az, amikor szöveg adja az emlékezetet. Fontos, hogy valami prefixmentes elválasztást találjunk ki, hogy az egyjegyű számok (pl. 7) ne forduljon elő azért, mert tartalmazza valamelyik kétjegyű szám (pl. 27). HTML tagekkel is megoldottam.

    Válasz
    • Így van András. A szöveges adatábrázolással előállított lottószelvény szép példa arra, hogyan lehet egyensúlyozni valamilyen saját fejlesztés és a beépített képességek használata között. A sorrendért is meg kell küzdeni. Konverziók is kellenek bele. Sokféle összefüggés jól érzékeltethető vele.

      Válasz
  3. Tiszteletem. Én vagy 20 éve készítettem egy online lottótípust. Ezt fejben alapoztam meg. Papírra vetettem. Nagy emberek is elismerik, hogy tökéletes. Levédettem. Most azon gondolkozom, hogy jöhetnek ki pl. a lottószámok. Persze adatokkal és fejben.

    Válasz
    • Ha ír részletesebb specifikációt Vince (hogyan, mit, milyen sorrendben állít elő, milyen adatokkal, sorozatokkal mi történjen), akkor biztosan lesz olyan hallgatónk, aki gyakorlásként szívesen “leprogramozza”. Például a teljes leszámolás alkalmas lehet tesztelésre, ellenőrzésre. Vagy sok-sok ismert kombinatorikai algoritmus implementációja is bevethető.

      Válasz

Szólj hozzá!