summittaiset numerot järjestykseen

shuf -i 1-39 -n 8 -o textest.txt
Miten saan samalle riville, kun nyt ne tulee päällekkäin? Tuo -i vipukaan ei varmaan toimi, kun numerot ovat sekajärjestyksessä, low to hi olisi tarkoitus?
jos toistan komennon niin vanha jyrätään, mikä ei olisi tarkoitus.
Olisi tarkoitus saada tulostamaan tekstitiedostoon 8 arvottua numeroa 1-39:stä kymmenelle riville. Watch ei kykene toistamaan, vaan kirjaa pelkkää sotkua. mutta jos ensin saisi edes sen yhden rivin oikein, niin olis hyvä alku. Netistä olen jo toista päivää etsinyt apuja, mutta aina kaatuu johonkin :)
1298
Äänestä

Muut lukivat myös

Vastaukset 12

Vanhimmat

  • Eiku hei. Tuo arpoo myös lisänumerot, niitä ei tarvitsiskaan.

    Äänestä

  • #include
    #include
    #include

    int cmpfunc (const void * a, const void * b)
    {
    return ( *(int*)a - *(int*)b );
    }

    int main()
    {

    /* alustaa satunnaislukugeneraattorin - tämän on oltava näin tai muuten rand tulostaa todennäköisemmin samoja numeroita */
    srand(time(NULL));

    /* hae 7 eri satunnaislukua väliltä 1 ja 39 */
    int c = rand() % (39 - 1 + 1) + 1;
    int d = rand() % (39 - 1 + 1) + 1;
    int e = rand() % (39 - 1 + 1) + 1;
    int f = rand() % (39 - 1 + 1) + 1;
    int g = rand() % (39 - 1 + 1) + 1;
    int h = rand() % (39 - 1 + 1) + 1;
    int i = rand() % (39 - 1 + 1) + 1;

    /* tarkista ettei numerot ole samoja tai kerro totuus */
    if (c == d || c == e || c == f || c == g || c == h || c == i || d == e || d == f || d == g || d == h || d == i || e == f || e == g || e == h || e == i || f == g || f == h || f == i || g == h || g == i || h == i) {
    printf ("en osaa!\n");
    }

    else {
    int numerot[] = {c, d, e, f, g, h, i};

    int n;

    qsort(numerot, 7, sizeof(int), cmpfunc);

    printf("\nTyhmyysveron oikeat numerot ovat: \n");
    for( n = 0 ; n < 7; n++ ) {
    printf("%d, ", numerot[n]);
    }

    printf("\n\n");

    /*
    Todellisuudessa lottokone arpoo numerot siten että jokainen arvottu pallo vähentää pallojen määrää joka on aluksi 39. Tästä johtuen ohjelman pitäisi osata poistaa juuri oikea numero väliltä 1 ja 39 ja laskea seuraava satunnaisluku vasta sitten. Kuten arvata saattaa, mitään yksinkertaista tapaa tähän ei ole, joten ohjelma laskee satunnaisluvun 7 kertaa 39 "pallon" joukosta. Kaikille onnenonkijoille tiedoksi, on huomattavasti helpompaa leikata paperista 39 samankokoista palaa, numeroida ne, sulloa kaikki muovipussiin ja ravistaa ne sekaisin. Vetämällä 7 lappua olet loihtinut lottonumerot huomattavasti satunnaisemmin kuin mihin tietokone tulee koskaan pystymään. Bonuksena, voit vetää pussin päähäsi.
    */
    }
    return(0);
    }

    Äänestä

  • mitennii "paras" ? kirjoitti:

    #include
    #include
    #include

    int cmpfunc (const void * a, const void * b)
    {
    return ( *(int*)a - *(int*)b );
    }

    int main()
    {

    /* alustaa satunnaislukugeneraattorin - tämän on oltava näin tai muuten rand tulostaa todennäköisemmin samoja numeroita */
    srand(time(NULL));

    /* hae 7 eri satunnaislukua väliltä 1 ja 39 */
    int c = rand() % (39 - 1 + 1) + 1;
    int d = rand() % (39 - 1 + 1) + 1;
    int e = rand() % (39 - 1 + 1) + 1;
    int f = rand() % (39 - 1 + 1) + 1;
    int g = rand() % (39 - 1 + 1) + 1;
    int h = rand() % (39 - 1 + 1) + 1;
    int i = rand() % (39 - 1 + 1) + 1;

    /* tarkista ettei numerot ole samoja tai kerro totuus */
    if (c == d || c == e || c == f || c == g || c == h || c == i || d == e || d == f || d == g || d == h || d == i || e == f || e == g || e == h || e == i || f == g || f == h || f == i || g == h || g == i || h == i) {
    printf ("en osaa!\n");
    }

    else {
    int numerot[] = {c, d, e, f, g, h, i};

    int n;

    qsort(numerot, 7, sizeof(int), cmpfunc);

    printf("\nTyhmyysveron oikeat numerot ovat: \n");
    for( n = 0 ; n < 7; n++ ) {
    printf("%d, ", numerot[n]);
    }

    printf("\n\n");

    /*
    Todellisuudessa lottokone arpoo numerot siten että jokainen arvottu pallo vähentää pallojen määrää joka on aluksi 39. Tästä johtuen ohjelman pitäisi osata poistaa juuri oikea numero väliltä 1 ja 39 ja laskea seuraava satunnaisluku vasta sitten. Kuten arvata saattaa, mitään yksinkertaista tapaa tähän ei ole, joten ohjelma laskee satunnaisluvun 7 kertaa 39 "pallon" joukosta. Kaikille onnenonkijoille tiedoksi, on huomattavasti helpompaa leikata paperista 39 samankokoista palaa, numeroida ne, sulloa kaikki muovipussiin ja ravistaa ne sekaisin. Vetämällä 7 lappua olet loihtinut lottonumerot huomattavasti satunnaisemmin kuin mihin tietokone tulee koskaan pystymään. Bonuksena, voit vetää pussin päähäsi.
    */
    }
    return(0);
    }

    ja includet on tietysti
    stdio.h
    stdlib.h
    time.h

    vaan eipä näy tällä palstalla teksti

    nuin tuohon tulee tietysti vielä } ennen viimeistä returnia ja sitä edeltävän tekstin ei tietenkään tarvitse olla lähdekoodissa (mutta olisi hyvä olla) ja kun tallentaa tekstin vaikka lotto.c nimellä niin se kääntyypi näppärästi komennolla

    gcc lotto.c

    tai miehekkäämmin

    cc lotto.c

    Äänestä

Yhden arvontarivin saat näin
shuf -i 1-39 -n 8 | sort -n | xargs echo

Voit tehdä bash-shellskriptin mihin pistät for-loopin ja tuo rivi sinne loopin sisään

Shellskriptin tulostuksen voi sitten ohjata tiedostoon, muuten se tulostaa vain näytölle.

Äänestä
  • Turha luulo, en vaan osaa. Yritin vääntää skriptiä, mutta tiedostoon tuli vain pätkiä skriptistä, eikä yhtään numeroa :D
    Tuo putkitus muuten toimisi ja numerotkin ovat samalla rivillä.

    Äänestä

  • ei onnistu millään kirjoitti:

    Turha luulo, en vaan osaa. Yritin vääntää skriptiä, mutta tiedostoon tuli vain pätkiä skriptistä, eikä yhtään numeroa :D
    Tuo putkitus muuten toimisi ja numerotkin ovat samalla rivillä.

    Tarkoititko jotain tällaista:

    for i in {1..10}
    do
    shuf -i 1-39 -n 8 | sort -n | xargs >> lottorivit.txt
    done

    Elikkä kirjoita yllä oleva teksti päätteelle ja paina enteriä, niin satunnaisnumerot ovat kymmenellä rivillä tekstitiedostossa..

    Äänestä

  • ei onnistu millään kirjoitti:

    Turha luulo, en vaan osaa. Yritin vääntää skriptiä, mutta tiedostoon tuli vain pätkiä skriptistä, eikä yhtään numeroa :D
    Tuo putkitus muuten toimisi ja numerotkin ovat samalla rivillä.

    $ cat lottorivit.sh
    _________________________

    #!/bin/bash
    for rivi in {1..10}
    do
    shuf -i 1-39 -n 8 | sort -n | xargs echo
    done
    _________________________

    Skriptille ajoluvat
    $ chmod a x lottorivit.sh
    Skriptin ajo (huom. piste keno :)
    $ ./lottorivit.sh

    Äänestä

  • toimaako tällainen? kirjoitti:

    $ cat lottorivit.sh
    _________________________

    #!/bin/bash
    for rivi in {1..10}
    do
    shuf -i 1-39 -n 8 | sort -n | xargs echo
    done
    _________________________

    Skriptille ajoluvat
    $ chmod a x lottorivit.sh
    Skriptin ajo (huom. piste keno :)
    $ ./lottorivit.sh

    Jos toimaa tuo ja oot innokas lottooja niin voit käynnistää skriptin ilman mitään piste keno tms. härdelleiitä ja täysin riippumatta siitä missä hakemistossa satut ite olemaan kun iskee tarve lottorivien arpomiseen:

    Näitten polkujen varrelta se järjestelmä oletuksena niitä taviksen ajettavia ohjelmia hakee
    $ echo $PATH
    /usr/local/bin: /usr/bin: /bin: /usr/local/games: /usr/games

    Eli kopsaa skripti esmes hakemistoon /usr/local/bin/ (jos löytyy em. polusta)
    Nyt se kopiointi tuonne pitää vaan tehdä roottina, esmes näin:
    $ su -c "cp lottorivit.sh /usr/local/bin/"

    Nyt toimaa ihan samoin kuin mikä tahansa käyttäjän komento (ilman abs. polkua komennon edessä)
    $ lottorivit.sh

    Ja jos oot oikein extra himo lottooja niin vois tiputtaa tuon .sh -tiedostopäätteenkin veks (taas roottina):
    $ su -c "mv /usr/local/bin/lottorivit.sh /usr/local/bin/lottorivit"

    Ja nyt sen voi sitten ajaa esmes näin:
    tavis@koneella~/missa/tahansa/hakemistossa$ lot [SARKAIN] [ENTER]
    tai jos muistaa skriptin nimen:
    tavis@koneella~/missa/tahansa/hakemistossa$ lottorivit

    ...jne...

    Äänestä

  • prof. Turhapuro kirjoitti:

    Tarkoititko jotain tällaista:

    for i in {1..10}
    do
    shuf -i 1-39 -n 8 | sort -n | xargs >> lottorivit.txt
    done

    Elikkä kirjoita yllä oleva teksti päätteelle ja paina enteriä, niin satunnaisnumerot ovat kymmenellä rivillä tekstitiedostossa..

    Siinä se on! Nyts tulostaa 10 riviä justiinsa oikein :)
    Itse en osannut tuota {1..10} laittaa :)

    Äänestä

Tarkoitin tuon rivin sellaisenaan for-loopin sisään skriptiin (esim arvo.sh) ja tiedosto-ohjauksen vasta skriptin ajoon:
./arvo.sh > lottorivit.txt
eli pelkkä ./arvo.sh tulostaa näytölle.

ps. muista chmod a x arvo.sh että skriptin ajo toimii

Äänestä

Kommentoi aloitusta


ei onnistu millään kirjoitti:

shuf -i 1-39 -n 8 -o textest.txt
Miten saan samalle riville, kun nyt ne tulee päällekkäin? Tuo -i vipukaan ei varmaan toimi, kun numerot ovat sekajärjestyksessä, low to hi olisi tarkoitus?
jos toistan komennon niin vanha jyrätään, mikä ei olisi tarkoitus.
Olisi tarkoitus saada tulostamaan tekstitiedostoon 8 arvottua numeroa 1-39:stä kymmenelle riville. Watch ei kykene toistamaan, vaan kirjaa pelkkää sotkua. mutta jos ensin saisi edes sen yhden rivin oikein, niin olis hyvä alku. Netistä olen jo toista päivää etsinyt apuja, mutta aina kaatuu johonkin :)

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