(H) Satunnaislukuja¶
Tavoite: Harjoittelen satunnaislukugeneraattorin käyttämistä.
Ohjeita:
Hae ohjelmakoodipohja: templates/03/random_numbers/
->
student/03/random_numbers/
.
Satunnaisluvuista¶
Kirjastosta random
löytyy luokka default_random_engine
, joka
on yksi kirjaston tarjoamista satunnaislukugeneraattoreista.
Kun kutsutaan satunnaislukugeneraattoriluokan rakentajaa (eli luodaan
satunnaislukugeneraattoriolio), voidaan parametrina antaa nk. siemenluku.
Jos siemenlukua ei anneta luomisen yhteydessä, se voidaan antaa
myöhemmin parametrina kutsuttaessa funktiota seed
.
Siemenluvun antamisen lisäksi täytyy myös kertoa, mitä jakaumaa halutaan
käyttää.
Kirjasto random
tarjoaa tähän useita vaihtoehtoja, mutta tässä
tapauksessa käytämme jakaumaa uniform_int_distribution
.
Jakaumalle täytyy lisäksi kertoa, miltä väliltä satunnaisluvut halutaan.
Esimerkiksi seuraavassa koodissa generoidaan viisi satunnaislukua
väliltä [1, 100]
siemenluvulla 42.
default_random_engine gen(42);
uniform_int_distribution<int> distr(1, 100);
std::cout << distr(gen) << std::endl;
std::cout << distr(gen) << std::endl;
std::cout << distr(gen) << std::endl;
std::cout << distr(gen) << std::endl;
std::cout << distr(gen) << std::endl;
(Myös seuraavan kierroksen vesipisarapelissä on käytetty satunnaislukuja. Sen materiaalista löytyy tarkempaa kuvausta aiheesta, mutta yllä oleva esittely riittää tämän tehtävän tekemiseen.)
Tehtävänanto¶
Koodipohjassa on valmiina pääohjelma, jossa luetaan ala- ja ylärajat välille, jolta satunnaisluvut generoidaan. Lisäksi siinä tarkistetaan, että alaraja on aidosti pienempi kuin yläraja.
Tehtävänäsi on toteuttaa funktio produce_random_numbers
,
joka tuottaa satunnaislukuja annetulle välille, kunnes käyttäjä
antaa lopetuskomennon q
.
Ohjelman on tarkoitus toimia seuraavasti:
Enter a lower bound: 1
Enter an upper bound: 10
Enter a seed value: 1
Your drawn random number is 1
Press c to continue or q to quit: c
Your drawn random number is 2
Press c to continue or q to quit: c
Your drawn random number is 8
Press c to continue or q to quit: c
Your drawn random number is 5
Press c to continue or q to quit: c
Your drawn random number is 6
Press c to continue or q to quit: c
Your drawn random number is 3
Press c to continue or q to quit: c
Your drawn random number is 1
Press c to continue or q to quit: q
Vinkkejä tehtävän tekemiseen:
- Käyttäjän antamat komennot (
c
jaq
) kannattaa lukea operaattorilla>>
, koska myös ala- ja ylärajat luetaan tällä operaattorilla. (Samassa ohjelmassa ei kannata lukea syötteitä sekä funktiollagetline
että operaattorilla>>
, ei ainakaan järjestyksessä: ensin>>
ja sittengetline
.) - Voit tietenkin kokeilla, mitä tapahtuu, jos käyttäisit komentojen
lukemiseen funktiota
getline
. Operaattorin>>
ja funktiongetline
erona on se, että edellinen jättää syötteen lopussa olevan rivinvaihtomerkin lukematta. Tämä lukematta jäänyt merkki pitää lukea pois syötevirrasta, jos halutaan myöhemmin käyttäägetline
-funktiota.
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.