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ä?
UNIX ja satunnaisluku
5
914
Vastaukset
- 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
- 1131254
Sinkkumiehet hukkaavat tärkeän ässän hihastaan kun
...eivät suostu kavereiksi naisten kanssa. Mikä voi olla heillä syynä? Hyväksyvät vain naisen, joka suorastaan anelee sa1211133- 1381013
Taitaa jäädä kotimaiset mansikat ostamatta
Kotimainen mansikka on niin kallista, että en ole vielä ainuttakana maistanut. Jos hinta pysyy näin korkealla niin tästä45855- 99843
"Kaikkien miesten asia" - kampanja on alkanut
Miehillä on naisiin kohdistuvan väkivallan lopettamisessa merkittävä rooli. Ei riitä, ettei itse tee väkivaltaa. Miesten316797Tiedät, että en voi enää laittaa viestiä
Aikaa kulunut. Eikä se näyttäisi enää luontevalta vastata näin pitkän ajan jälkeen. Tiedän myös, että sinä et enää lait82704Lautakunta käsittelee Iisalmen kulttuuri- ja vapaa-aikajohtajan virkasuhteen purkua koeajalla:
Lautakunta käsittelee Iisalmen kulttuuri- ja vapaa-aikajohtajan virkasuhteen purkua koeajalla: "Aina valinta ei mene nap54636Kun kohtaatte rakkauden, tarttukaa siihen
Toimisinko jälkiviisaana toisin? Varmasti. Vaikka silloin kuvittelin tekeväni, niin kuin on oikein. Mahdollisimman siist49619Lienee aika luopua siitä kaikesta
mitä meillä ikinä olikaan. Hassua, koska juuri mitään ei ole edes ollutkaan. En vaan jaksa tätä mahdotonta juttua enää j64592