(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 q to quit or any other key to continue: c

Your drawn random number is 2
Press q to quit or any other key to continue: c

Your drawn random number is 8
Press q to quit or any other key to continue: c

Your drawn random number is 5
Press q to quit or any other key to continue: c

Your drawn random number is 6
Press q to quit or any other key to continue: c

Your drawn random number is 3
Press q to quit or any other key to continue: c

Your drawn random number is 1
Press q to quit or any other key to continue: q

Vinkkejä tehtävän tekemiseen:

  • Käyttäjän antamat komennot (c ja q) kannattaa lukea operaattorilla >>, koska myös ala- ja ylärajat luetaan tällä operaattorilla. (Samassa ohjelmassa ei kannata lukea syötteitä sekä funktiolla getline että operaattorilla >>, ei ainakaan järjestyksessä: ensin >> ja sitten getline.)
  • Voit tietenkin kokeilla, mitä tapahtuu, jos käyttäisit komentojen lukemiseen funktiota getline. Operaattorin >> ja funktion getline 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.