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

885

    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. Kuolemanrangaistus

      Mielestäni kuolemanrangaistus on väärin kaikissa tilanteissa. Vaikka joku olisi murhannut 10 ihmistä, hänen surmaaminen
      Laki ja rikos
      71
      5545
    2. Muistakaa persut, että TE petitte, ei kokoomus

      Miksikö kukaan ei arvostele kokoomusta? No sen vuoksi, että kokoomus noudattaa vaalilupauksiaan. Sen sijaan TE persut,
      Maailman menoa
      273
      4866
    3. Riikka Purra ei estä tehomaksun käyttöönottoa

      Sähkön hinnoittelua koskevan määräyksen on määrä astua voimaan vuoden 2029 alusta, Energiavirastosta kerrotaan. Määräyk
      Maailman menoa
      40
      3174
    4. Seuraava hallituspohja - Kokoomus, kepu, persut + KD

      Kokoomus saa ainakin 20% kannatuksen ensi vaaleissa, keskusta sanoisin noin 15%, persut todennäköisesti enemmän, ehkä 17
      Maailman menoa
      255
      3004
    5. Outo ilmiö - vasemmistolaiset eivät kirjoita mitään kokoomuksesta

      joka sentään johtaa hallitusta, ja jonka talouspolitiikkaa noudatetaan. Nämä muutamat vasemmistolaiset jotka täällä aina
      Maailman menoa
      103
      2630
    6. Lopetan ikävöinnin

      Ei meistä enää koskaan tule mitään. Olen ikävöinyt ja kaivannut enkä saa mitään vastakaikua ja lämpöä. Parempi erillään
      Ikävä
      5
      2102
    7. Maria Veitola kommentoi soutelija Saarion huomionhakuisuutta

      "Minusta on jotenkin kuvottavaa, kuinka kovalla intensiteetillä Suomi-media seuraa miessankari Jari Saarion merihätää. S
      Kotimaiset julkkisjuorut
      336
      2062
    8. Muovipusseista pitäisi saada panttimaksu takaisin

      Ostan joka päivä yhden muovipussin, ja niistä palautuu keskimäärin takaisin kaupan pullomaatin yhteydessä olevaan roskik
      Maailman menoa
      65
      1781
    9. Väestöstä vain vassarit vaihtuvat nopeammin kuin persut

      Kevääseen 2023 verrattuna vassareita 50 prosenttia enemmän, ja persuja 25 prosenttia vähemmän.
      Maailman menoa
      15
      1555
    10. Jos kaikki lopulta kuolevat, onko edes pahimmillakaan rikoksilla mitään väliä?

      Kaikki kuolevat lopulta. Siksi ihmisten tekemillä rikoksillakaan ei lopulta ole mitään merkitystä. Joidenkin mielestä t
      Filosofia
      2
      1546
    Aihe