3.3 Satunnaisluvut ja lukujen pyöristäminen

Yhteenveto



Sanallinen algoritmi
  1. Arvotaan desimaalilukumuuttujalle luku1 arvo väliltä [0,10].
  2. Arvotaan kokonaislukumuuttujalle luku2 arvo väliltä [0,100].
  3. Arvotaan kokonaislukumuuttujalle luku3 arvo väliltä [20,50].
  4. Arvotaan kokonaislukumuuttujalle luku4 arvo väliltä [-10,10].
  5. Aseta ikkunan kooksi 450 px vaakaan ja 450 px pystyyn.
  6. Aseta taustaväriksi valkoinen.
  7. Aseta tekstin väriksi musta.
  8. Aseta tekstin kooksi koko 24.
  9. Tulosta muuttujan luku1 arvo paikkaan (50,50).
  10. Tulosta muuttujan luku2 arvo paikkaan (50,100).
  11. Tulosta muuttujan luku3 arvo paikkaan (50,150).
  12. Tulosta muuttujan luku4 arvo paikkaan (50,200).
  13. Tulosta jakolaskun 14.0/5.0 pyöristetty arvo paikkaan (50,250).
  14. Tulosta jakolaskun 14/5 pyöristetty arvo paikkaan (50,300).
  15. Tulosta jakolaskun 14.0/5.0 katkaistu arvo paikkaan (50,350).
  16. Tulosta jakolaskun 14.0/5.0 jakojäännös paikkaan (50,50).

// 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.

Sanallinen algoritmi
  1. Määrittele desimaalilukumuuttuja: luku1 ja anna sille arvoksi desmaaliluku väliltä 0...1.
  2. Määrittele desimaalilukumuuttuja: luku2 ja anna sille arvoksi desimaaliluku väliltä 0...100.
  3. Määrittele kokonaislulumuuttuja: luku3 ja anna sille arvoksi kokonaisluku väliltä 0...100.
  4. Määrittele kokonaislukumuuttuja: luku4 ja anna sille arvoksi kokonaisluku väliltä 1...40.
  5. Aseta ikkunan kooksi 500 px vaakaan ja 300 px pystyyn.
  6. Aseta ikkunan taustaväriksi valkoinen.
  7. Aseta tekstin väriksi musta.
  8. Aseta tekstin kooksi 24 px.
  9. Tulosta muuttujan luku1 arvo paikkaan (100,50).
  10. Tulosta muuttujan luku2 arvo paikkaan (100,100).
  11. Tulosta muuttujan luku3 arvo paikkaan (100,150).
  12. Tulosta muuttujan luku4 arvo paikkaan (100,200).

// 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));

Huomio: Arpomiskomento voidaan myös lyhentää muotoon:
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.

Tehdään ensin ohjelma, joka arpoo yhden kokonaisluvun väliltä -100...100.

Sanallinen algoritmi
  1. Määrittele kokonaislukumuuttuja nimeltään: luku, ja anna sille arvoksi kokonaisluku väliltä -100...100.
  2. Aseta ikkunan kooksi 400 px vaakaan ja 200 px pystyyn.
  3. Aseta ikkunan taustaväriksi valkoinen.
  4. Aseta tekstin väriksi musta.
  5. Aseta tekstin kooksi 20 px.
  6. Tulosta muuttujan luku arvo paikkaan (10,100).

// 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.

Sanallinen algoritmi
  1. Aseta ikkunan kooksi 400 px vaakaan ja 200 px pystyyn.
  2. Aseta tekstin väriksi musta.
  3. Aseta tekstin kooksi 20 px.
  4. Aseta ikkunan päivitysnopeus taajuuteen 1 Hz.
  5. Määrittele kokonaislukumuuttuja nimeltään: luku, ja anna sille arvoksi kokonaisluku väliltä -100...100.
  6. Tyhejennä tausta ja aseta sen väriksi valkoinen.
  7. Kirjoita muuttujan luku arvo paikkaan (10,100).

// 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.

Sanallinen algoritmi
  1. Aseta ikkunan kooksi 300 px vaakaan ja 150 px pystyyn.
  2. Aseta ikkunan taustaväriksi valkoinen.
  3. Aseta tekstin väriksi musta.
  4. Aseta tekstin kooksi 32 px.
  5. Määrittele desmaalilukumuuttuja nimeltään: a, ja anna sille arvo: 18.0.
  6. Määrittele desimaalilukumuuttuja nimeltään: b, ja anna sille arvo: 7.0.
  7. Tulosta muuttujan a arvo eli osoittaja pyöristettynä kokonaisluvuksi paikkaan (10,50).
  8. Tulosta viiva muuttujan a alapuolelle eli pisteiden (10,60) ja (60,60) välille.
  9. Tulosta muuttujan b arvo eli nimittäjä pyöristettynä kokonaisluvuksi paikkaan (10,100).
  10. Tulosta yhtäsuruusmerkki paikkaan (80,70).
  11. Tulosta jakolaskun a:b kokonaisosa paikkaan (120,70).
  12. Tulosta jakolaskun a:b jakojäännös paikkaan (150,50).
  13. Tulosta viiva jakojäännöksen alapuolelle eli pisteiden (150,60) ja (190,60) välille.
  14. Tulosta muuttujan b arvo eli nimittäjä pyöristettynä kokonaislukuvuksi paikkaan (150,100).

// 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?