UNIX ja satunnaisluku

Matti.W

Miksi seuraava komentojono antaa joka kerta ajettaessa saman luvun?

#!/bin/sh
a=`date ' %N'`      #nanosekunnit
a=`expr $a \/ 1000`   #muutetaan ne mikrosekunneiksi
gawk 'BEGIN {srand($a);print rand();}'



Ei auta vaikka jättäisi kolmannen rivin pois. Komentojonolla yritin alustaa awk:n satunnaislukugeneraattorin komentotulkin päivyrin antamilla nanosekunneilla.

Sen sijaan seuraava komento antaa kyllä eri luvun mutta se alustaa satununnaislukugeneraattorin kellonajalla mutta vain kerran sekunnissa, saman sekunnin sisällä otetut luvut ovat samoja:

gawk 'BEGIN {srand();print rand();}'

Miten Linuxin saisi antamaan useita satunnaislukuja sekunnin sisällä?

5

860

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Catilina

      Todella satunnaisten lukujen tuottaminenhan on aika mahdotonta. Anna joku laskutoimitus, josta varmasti tiedät, että tulos on irrationaaliluku, ja ota siitä vaikka joka kolmas numero tms.
      Parempiakin ehdotuksia voi löytyä.

      • kellokin

        ...on hyvä satunnaislukujen siementäjä mutta silloin pitää käyttää millisekunteja ja mielellään niin että siinä on mukana vaikkapa käyttäjän vasteaika tai joku muu oikeasti satunnainen suure.

        Aloittajan otsikko on kovasti hämäävä niinkuin tämä olisi jotenkin Linuxiin liittyvä ongelma. Jos tietokone jotenkin osaisi itse laskemalla tuottaa satunnaislukuja niin saattaisi oikeidenkin laskutoimitusten tulokset vähän värähdellä.


    • Ossi

      Tuottaa nopeasti lähes kaikkeen kelpaavaa bittimösöä.

    • Ongelmassa on kyse vain shellin normaalista tekemästä komentorivin laajennuksesta. '':n sisällä olevaa tavaraa ei laajenneta. Sen sijaan "":n sisällä oleva laajennetaan. Esim.

      export A=1
      ja
      echo "A=$A"
      on eri asia kuin
      echo 'A=$A'

      Tässä tapauksessa homma menee näin:
      gawkille annetaan yksi argumentti, joka on kaikki noiden '':n sisällä oleva tavara. Tätä viimeistä riviä ei laajenneta, joten gawk saa tuon koodin sananmukaisesti (eli shellissä $a:aa ei laajenneta ennen kuin gawk ajetaan).

      gawkin syntaksissa muuttujiin viitataan muodossa $muuttuja. Muuttujaa a ei ole tuossa vielä määritelty, joten se on tyhjä, ja srand ei saa yhtään argumenttia. gawkissa srand taitaa käyttää juuri kellonaikaa, jos sille ei anneta mitään argumenttia.

      Ratkaisu on siis käyttää lainausmerkkejä gawkin argumentin ympärillä:

      gawk "BEGIN {srand($a);print rand();}"

      bashia käytettäessä kannattaa lukaista kappale quoting.

    • laitetta

      Mikäli satunnaisuuden tarve ei ole niin valtava niin /dev/random ja /dev/urandom antavat pseudorandomia. urandom nopeammin ja random paremmin. Tai Bashissa vaikka: expr $RANDOM % 10

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Kanki kovana; ei tiedä pornovideoista mitään

      Kaikkosen erityis­avustajan asunnossa kuvattiin pornoa. Väittää ettei tiedä asiasta yhtään mitään. https://www.is.fi/po
      Maailman menoa
      121
      6030
    2. Halaisin sua mies

      Jos voisin 💗
      Ikävä
      29
      2120
    3. Onkohan meillä kummallakin joku pakkomielle toisiimme

      Vähän luulen että on..
      Ikävä
      177
      1952
    4. Mitä tämä on

      Ajatella, olen viimeksi nähnyt sinua melkein vuosi sitten ohimennen. Ja silloinkin sinä välttelit minua. En ole kuullut
      Tunteet
      10
      1123
    5. Ei monet elä kuin alle 60 v, mikä vaikuttaa?

      gulp, gulp.. Juice Leskinen eli 56 vuotta. Matti Nykänen eli 55 vuotta. Topi Sorsakoski eli 58 vuotta.
      Maailman menoa
      66
      1114
    6. Hyvää yötä kaivatulleni

      En pysty tekemään kokemaan mitään sielussa tuntuvaa, syvää, vaikuttavaa, ilman että rinnastan sen sinuun. Niin kävi tänä
      Tunteet
      24
      997
    7. Olen valmis

      Kohtaamaan sinut tänä kesänä, jos sellainen sattuma osuu kohdalleni.
      Ikävä
      73
      987
    8. Nyt on konstit vähänä.

      Nimittäin tuulivoiman vastustajilla, kun pitää perättömiä ilmiantoja tehdä. Alkaa olla koko vastustajien sakki leimattu,
      Kiuruvesi
      24
      902
    9. Tilinpäätösvaltuusto 27.5

      Samalla viimeinen kokous ennen uudenvaltuustokauden alkamista. Vanhat antavat itselleen erinomaiset arvosanat, ja siirty
      Pyhäjärvi
      42
      897
    10. Hevoset ajoteillä Karhulanvaaralla

      Minkä ihmeen takia osaamattomat ihmiset tuovat hevosia ajoteille ja pyöräteille? Eilen oli kolari lähellä tämän takia. I
      Suomussalmi
      12
      765
    Aihe