satunnaislukuongkelma

Mulla on viisi satunnaislukua väliltä 1-52. Nyt tarvis jotenkin tarkistaa, että luvut ei ole samoja, osaako joku neuvoa. If-lauseilla tulee niin monta riviä, luulisi olevan helpompi ratkaisu.

Teen hommia BorlandBuilder5:lla eli C .
7300
Äänestä

Muut lukivat myös

Vastaukset 7

Vanhimmat

hidas:
arvo luku
tarkista löytyyko luku jo arvotuista (luvut taulukossa tms)
jos löytyy arvo uudestaan tarkista jne.
jo ei löydy -> ok, jatka eteenpäin

tilaa vievä:
arvot lukuja 1-52, tee vektori (taulukko tms), jossa kys. indeksit. tietotyypiksi vaikka boolean (true=arvottu jo, false="vapaa luku")
Jos käyttämäsi kieli ei alusta taulua, alusta taulu arvolla "vapaa luku"
aina kun arvot luvut, tarkistat taulusta, onko se vapaa. jos ei, arvot uusiksi jne. kunnes kaikki 5 on arvottu. Nopeampi konsti kuin eka mutta vaatii työtilaa.

2:n potensseille tiedän algorimin, joka antaa lukuja haluamallasi tavalla, mutta 52 ei valitettavasti ole 2:n potenssi :(

Äänestä
  • kiitoksia!!!

    Äänestä

  • qqq kirjoitti:

    kiitoksia!!!

    Nojoo tuo on ihan hyvä useiden lukujen arpomiseen mutta ehkä turhaa työtä sekoitella 52 numeron pakkaa saadakseen 3 numeroa?

    Ei tämä iflauseviidakko niin karmea ole kuin voisi kuvitella:

    int luku1=0, luku2=0, luku3=0;
    int r;

    while(1)
    {
    r = 1 rand()R;
    // jos arvottu luku on jo ennestään arvotaan uusi
    if( r==luku1 || r==luku2 || r==luku3 ) continue;

    if( luku1 ) // luku1 on jo
    if( luku2 ) // luku2 on jo
    if( luku3 ) // luku3 on jo
    break; // kaikki on, pois silmukasta
    else luku3 = r;
    else luku2 = r;
    else luku1 = r;
    }
    }

    Äänestä

  • joku kirjoitti:

    Nojoo tuo on ihan hyvä useiden lukujen arpomiseen mutta ehkä turhaa työtä sekoitella 52 numeron pakkaa saadakseen 3 numeroa?

    Ei tämä iflauseviidakko niin karmea ole kuin voisi kuvitella:

    int luku1=0, luku2=0, luku3=0;
    int r;

    while(1)
    {
    r = 1 rand()R;
    // jos arvottu luku on jo ennestään arvotaan uusi
    if( r==luku1 || r==luku2 || r==luku3 ) continue;

    if( luku1 ) // luku1 on jo
    if( luku2 ) // luku2 on jo
    if( luku3 ) // luku3 on jo
    break; // kaikki on, pois silmukasta
    else luku3 = r;
    else luku2 = r;
    else luku1 = r;
    }
    }

    Oho minulla on vissin lukihäiriö =) Lukuja olikin viisi no eikai se mitään haittaa..

    Äänestä

  • joku kirjoitti:

    Nojoo tuo on ihan hyvä useiden lukujen arpomiseen mutta ehkä turhaa työtä sekoitella 52 numeron pakkaa saadakseen 3 numeroa?

    Ei tämä iflauseviidakko niin karmea ole kuin voisi kuvitella:

    int luku1=0, luku2=0, luku3=0;
    int r;

    while(1)
    {
    r = 1 rand()R;
    // jos arvottu luku on jo ennestään arvotaan uusi
    if( r==luku1 || r==luku2 || r==luku3 ) continue;

    if( luku1 ) // luku1 on jo
    if( luku2 ) // luku2 on jo
    if( luku3 ) // luku3 on jo
    break; // kaikki on, pois silmukasta
    else luku3 = r;
    else luku2 = r;
    else luku1 = r;
    }
    }

    Pakan ts taulukon "sekoittamiseen" on monta tapaa, ei siinä ole pakko tehdä turhaa työtä lainkaan, kuten aikaisemmin osoittamani linkin takaa selviää.

    Iflauseviidakossasi on ainakin se huono puoli, että ohjelma voi teoriassa jäädä ikuiseen silmukkaan. Käytännössä näin ei tietenkään tapahdu, mutta...!

    Iflauseviidakkoa voisi soveltaa vaikka seuraavasti:

    unsigned i,j,luku[5];

    for (i=0; i

    Äänestä

  • joku kirjoitti:

    Nojoo tuo on ihan hyvä useiden lukujen arpomiseen mutta ehkä turhaa työtä sekoitella 52 numeron pakkaa saadakseen 3 numeroa?

    Ei tämä iflauseviidakko niin karmea ole kuin voisi kuvitella:

    int luku1=0, luku2=0, luku3=0;
    int r;

    while(1)
    {
    r = 1 rand()R;
    // jos arvottu luku on jo ennestään arvotaan uusi
    if( r==luku1 || r==luku2 || r==luku3 ) continue;

    if( luku1 ) // luku1 on jo
    if( luku2 ) // luku2 on jo
    if( luku3 ) // luku3 on jo
    break; // kaikki on, pois silmukasta
    else luku3 = r;
    else luku2 = r;
    else luku1 = r;
    }
    }

    Muistui mieleeni pari vanhaa juttua tältä palstalta:

    http://keskustelu.suomi24.fi/show.cgi?category=108&conference=652&posting=10500000000003036

    http://keskustelu.suomi24.fi/show.cgi?category=108&conference=652&posting=20500000000391019

    Äänestä

Kommentoi aloitusta


qqq kirjoitti:

Mulla on viisi satunnaislukua väliltä 1-52. Nyt tarvis jotenkin tarkistaa, että luvut ei ole samoja, osaako joku neuvoa. If-lauseilla tulee niin monta riviä, luulisi olevan helpompi ratkaisu.

Teen hommia BorlandBuilder5:lla eli C .

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu