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

914

    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. Mikä teidän jutussa on ongelmana?

      Missä meni pieleen?
      Ikävä
      172
      1445
    2. Kauhavan häiriköijistä

      Juttua Iltalehdessä. Pakko sanoa että noi nuoret on kyllä ihan pimeitä. Putkin peltoja jupksevat kiusaamaan kun ei tietä
      Kauhava
      41
      1029
    3. Haluan sinut, kuuletko minua.

      Haluan sinut. Toivon, että voisimme olla yhdessä. Mietin pystynkö täyttämään toiveesi, olemaan arvoisesi. Voisitko saad
      Ikävä
      38
      735
    4. Auto ajoi päälle?

      Ja pakeni luin iltapäivälehdestä. ! Ken on kuski joka tuollee teki
      Kuusankoski
      14
      650
    5. Sama ransetti taas!

      Keikkui tällä kertaa Honkavaaran tien varressa muutaman sadan metrin päässä Louhenkoskelta.. Otin rekisterin ylös ja ver
      Hyrynsalmi
      21
      640
    6. Hän on tosi

      hyvännäköinen. Ei edes ryppyi oo. :D
      Ikävä
      37
      637
    7. Miksi Lapset kiusaa yöllä

      Miksi Lapset kiusaa yöllä ihmisiä? Miksi vanhemmat antaa tämän tapahtua? Eikö ne huomaa ettei lapset ole kotona vai eivä
      Kauhava
      28
      632
    8. Tehdäänkö tänään toiveista totta?

      Poikkea tänä illasta siinä lähellä ja annetaan silmien puhua ja sen jälkeen puhu sinä lopulta mitä ajattelet..
      Ikävä
      46
      607
    9. Viimeinen lankafest

      Käykää viimeisessä lanka festissä. Ensivuonna sitä ei enää ole. Rahat on loppu. Harmi .
      Puolanka
      17
      583
    10. Ajatteletko ollenkaan minua

      Naiselle, jonka kanssa vahva tunne yhteydestä. Jota kipeästi kaipaan, mutta jota ei juuri näe. Onko siitä jo kolme vuott
      Ikävä
      30
      577
    Aihe