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
881
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
Vilma Nissinen pyytää anteeksi rasistisia lausuntojaan
Nöyrtyi kuten persut yleensäkin. On kyllä noloa tuollainen vätystely, kun ei ole miestä seisoa omien lausuntojensa takan2243488Riikka Purra: "Kokoomus haluaa leikata pienituloisten etuuksista - Se ei meille käy"
Näin vakuutti persujen Purra edellisten eduskunta vaalien alla,. https://www.ku.fi/artikkeli/4910942-kun-uudessa-videos622134Sandels tölkin hinta nousi 1,29 eurosta 1,32 euroon
Mitähän järkeä valtiolla on verottaa tuotakin elintarviketta niin kovasti, että on järkevämpää käydä hakemassa ulkomailt401708Lindtmanin pääministeriys lähenee päivä päivältä
Suomen kansan kissanpäivät alkavat siitä hetkestä, kun presidentti Stubb on tehnyt nimityksen. Ainoastaan ylin tulodesi651613- 1051357
Tuntuuko sinusta mies
että olet jossain, mutta sydämessäsi haluat olla muualla. Suunnittelet kaikkea kivaa ja olet innolla mukana, mutta silti221245Ikävä uutinen uudesta Unelmia Italiassa kaudesta - Iso pettymys tv-katsojille!
Unelmia Italiassa -sarja kertoo Ellen Jokikunnaksen perheen elämästä Suomessa ja Italiassa. Nyt Ellen on kertonut tuleva71122Rakastan sitä
kun uppoat selittämään jotain. Etsit oikeaa tapaa sanoa jotain, jonka olet jo etukäteen miettinyt, sekoat vähän sanoissa511064Jokaisella tytöllä on supervoimansa
Millaisia ajatuksia artikkeli herättää? Mainos: Dove | ”Itsetuntoni oli ihan romuttunut” – Peppina Rosén haastaa tavan1981001Mitä tapahtuisi....
Meidän välillä jos törmäisimme yöelämässä ilman häiriötekijöitä ja olisimme hieman huppelissa? Päättyisikö ilta kenties61957