3.3 Satunnaisluvut ja lukujen pyöristäminen
Yhteenveto

|
// Ohjelman tehnyt: e-Oppi Oy
// 29.1.2017
float luku1 = random(10);
int luku2 = round(random(100));
int luku3 = 20+round(random(30));
int luku4 = -10+round(random(20));
void setup() {
size(450,450); // Ikkunan koko
background(255); // Taustaväri valkoinen
fill(0); // Tekstin väri musta
textSize(24); // Fontin koko
}
void draw() {
text(luku1,50,50);
text(luku2,50,100);
text(luku3,50,150);
text(luku4,50,200);
text(round(14.0/5.0),50,250);
text(round(14/5),50,300);
text(int(14.0/5.0),50,350);
text(14%5,50,400);
}
Lukujen arpominen
| random(luku); | Arpoo desimaaliluvun väliltä [0,luku] . |
| round(random(luku)); | Arpoo kokonaisluvun väliltä [0,luku]. |
Komennolla random(luku); voimme arpoa lukuja väliltä: 0…luku. Arvottu luku on aina desimaaliluku. Mikäli haluamme pyöristää desimaaliluvun kokonaisluvuksi, niin sen voi tehdä:
round(desimaaliluku); - komennolla. Jos arpominen laitetaan void draw ( ) -lohkon sisälle, arpominen suoritetaan jatkuvasti uudestaan ja uudestaan. Jos haluamme arpoa kokonaisluvun väliltä [0,luku], arpomiskomento on kirjoitettava muotoon: round(random(luku));
Mikäli haluamme arpoa luvun vain kerran, niin silloin arpominen ja lukujen sijoittaminen muuttujille pitää laittaa heti ohjelman alkuun. Tässä on siis esimerkki globaaleista muuttujista.
Tutkitaan lukujen arpomista esimerkin avulla. Luku1-muuttuja saa desimaaliluvun väliltä 0…1. Luku2-muuttuja saa arvoksi desimaaliluvun väliltä 0…100. Samoin luku3 paitsi, että luku3 on kokonaisluku, johtuen pyöristyskomennosta. Luku4 saa arvoksi satunnaisluvun väliltä 1...39. Arpominen tapahtuu välillä 0...38, mutta kun tähän arvottuun lukuun lisätään 1, niin tällöin arvottu luku on väliltä 1...39.
|
// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
float luku1 =random(1); // Arvotaan desimaaliluku väliltä 0..1
float luku2 = random(100); // Arvotaan desimaaliluku väliltä 0..100
int luku3 = round(random(100)); // Arvotaan kokonaisluku väliltä 0..100
int luku4 = 1 + round(random(39)); // Arvotaan luku väliltä 1..40
void setup() {
size(500,300); // Ikkunan koko
background(255); // Taustaväri valkoinen
fill(0); // Tekstin väri musta
textSize(24); // Fontin koko 24
}
void draw() {
text(luku1,100,50);
text(luku2,100,100);
text(luku3,100,150);
text(luku4,100,200);
}
Kun ohjelma ajetaan, niin tulostus näyttää esimerkiksi tältä.

Arpominen komennolla random(luku); palauttaa aina desimaaliluvun, siksi luku1 ja luku2 on määritelty double tyyppisiksi eli näihin muuttujiin sijoitetaan desimaalilukuja. Kun lisäämme vielä komennon round(luku); niin saamme desimaaliluvun muutettua kokonaisluvuksi, siksi luku3 ja luku4 muuttujat on määritelty int-tyyppisiksi muuttujiksi eli näihin muuttujiin sijoitetaan vain kokonaislukuja.
Yhteenvetona voimme todeta, että jos haluamme arpoa kokonaisluvun lukuväliltä [a,b], niin siihen pätee seuraava kaava.
| a+round(random(b-a)); | Komento arpoo satunnaisluvun väliltä [a,b]. |

Esimerkiksi, jos haluat arpoa luvun väliltä 10...30, niin kirjoita arpomiskomento muotoon:
10+round(random(20));
| round(random(a,b)); | Komento arpoo satunnaisluvun väliltä [a,b]. |
Eli jos arvot kokonaisluvun väliltä 10...30, niin arpomiskomento on muotoa: round(random(10,30));
Luvun pyöristäminen
Desimaaliluku voidaan muuttaa kokonaisluvuksi kahdella eri tavalla. Joko pyöristämällä desimaaliluku tai muuttamalla konversiolla desimaaliluku kokonaisluvuksi, jossa luku katkaistaan kokonaisosasta.
| round(desimaaliluku); | Komento pyöristää desimaaliluvun kokonaisluvuksi. |
| int(desimaaliluku); | Komento katkaisee luvun kokonaisluvuksi. |
Näiden komentojen ero on se, että int komento katkaisee luvun ja round komento pyöristää luvun. Esimerkiksi komento int(2.8) antaa tulokseksi 2, kun taas komento round(2.8) antaa tulokseksi 3. Pyöristyksen rajakohta on 5 eli jos ensimmäinen desimaaliluku on viisi tai suurempi, niin luku pyöristetään ylöspäin. Esimerkiksi round(1.49) pyöristää luvun 1:ksi eli alaspäin, mutta round(1.5) pyöristää luvun 2:ksi eli ylöspäin.
Arpominen void draw ( ) -lohkossa.
|
// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
int luku = -100+round(random(200));
// Arvotaan kokonaisluku väliltä [-100,100]
void setup() {
size(400,200); // Asetetaan ikkunan koko
background(255); // Asetetaan taustaväri valkoiseksi
fill(0); // Asetetaan tekstin väri mustaksi
textSize(20); // Asetetaan tekstin kooksi 20
}
void draw() {
text(luku,10,100);// Tulostetaan arvottu luku
}
Koska arpominen tehdään heti ohjelman alussa, niin arpominen tehdään vain kerran. Entä jos haluamme arpoa lukuja jatkuvasti. Siirretään arpomiskomento void draw () -lohkoon, niin arpominen tapahtuu jatkuvasti.
|
// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
void setup() {
size(400,200); // Asetetaan ikkunan koko
fill(0); // Asetetaan tekstin väri mustaksi
textSize(20); // Asetetaan tekstin kooksi 20
frameRate(1); // Muutetaan ikkunan päivitysnopeus arvoon 1 Hz
}
void draw() {
int luku = -100+round(random(200)); // Arvotaan kokonaisluku
background(255); // Asetetaan taustaväri valkoiseksi
text(luku,10,100);// Tulostetaan arvottu luku
}
Jotta ohjelmasta tulisi järkevä, niin myös komento background(255); on siirrettävä void draw (); -lohkoon ennen text();-komentoa. Tällöin ikkuna putsataan aina ennen uuden luvun tulostamista. Muuten kävisi niin, että arvotut tekstit tulostuisivat päällekkäin.
Lisäksi arpominen tapahtuu vielä liian nopeasti. Voimme hidastaa ikkunan päivitystä komennolla frameRate(taajuus); komennolla. Komento frameRate(1); päivittää ikkunaa yhden sekunnin välien, jolloin arpominen on paljon hitaampaa. Jos haluat arpomisen kahden sekunnin välien, niin silloin laita komento muotoon frameRate(0.5);. Vastaavasti komento frameRate(2); arpoo luvun puolen sekunnin välein. Sanotaan, että taajuus ja värähdysaika ovat toistensa käänteisarvoja. Komento frameRate(taajuus); laitetaan void setup () -lohkoon.
Onko mahdollista arpoa vain kerran void draw () -lohkossa? Tutkitaan seuraavaa esimerkkiä.
// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
void setup() {
size(400,200); // Asetetaan ikkunan koko
fill(0); // Asetetaan tekstin väri mustaksi
textSize(20); // Asetetaan tekstin kooksi 20.
noLoop(); // Komento estää ikkunan päivityksen
}
void draw() {
int luku = -100+round(random(200)); // Arvotaan kokonaisluku
background(255); // Valkoinen taustaväri
text(luku,10,100);// Tulostetaan arvottu luku
}
Komennolla noLoop(); voidaan estää ikkunan päivitys eli tällöin void draw (); -lohko suoritetaan vain kerran.
Esimerkki: Kokonaisosa ja jakojäännös
Olkoon meillä murtoluku: [[$\dfrac{18}{7}$]]. Sekalukuna tämä olisi: [[$2\dfrac{4}{7}$]]. Kuinka ohjelmoinnissa murtoluku muutetaan sekaluvuksi? Se onnistuu seuraavilla komennoilla.
|
int(18/7) |
Tulostuu: 2 eli kokonaisosa. |
|
18%7 |
Tulostuu: 4 eli jakojäännös. |
Yhteenvetona voidaan todeta, että int(murtoluku) komennolla saadaan selville kokonaisosa ja kirjoittamalla murtoluku muotoon a%b saadaan selville jakojäännös. % merkki tarkoittaa ohjelmoinnissa jakojäännöstä.
Kokonainen ohjelma, joka muuttaa minkä tahansa muroluvun sekaluvuksi on seuraavanlainen.
|
// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
void setup() {
size(300,150); // ikkunan koko
background(255); // Taustaväri valkoinen
fill(0); // Täyttöväri musta
textSize(32); // Tekstin koko 32
}
void draw() {
float a = 18.0; // Jaettava
floa b = 7.0; // Jakaja
text(round(a),10,50); // Tulosteaan murtoluvun a/b osoittaja
line(10,60,60,60); // Jakoviiva
text(round(b),10,100); // Tulostetaan murtoluvun a/b nimittäjä
text("=",80,70); // Tulostetaan yhtäsuuruusmerkki
text(int(a/b),120,70); // Kokonaiset
text(round(a%b),150,50); // Jakojäännös
line(150,60,190,60); // Jakoviiva
text(round(b),150,100); // Jakaja
}
Ohjelman esimerkkiajo näyttää tältä.

Koska jaettava ja jakaja on ohjelmassa muuttujina, niin voit helposti muuttaa minkä tahansa murtoluvun sekaluvuksi yksinkertaisesti muuttamalla muuttujien arvoa. Tässä ohjelmassa round(luku) komentoa on käytetty vain siksi, että luku tulostuu kokonaislukuna ilman desimaalipisteen jälkeisiä nollia.
Kokeile muuttaa muuttujien a ja b arvoja. Mitä huomaat?