Informaatio, data ja tieto
Learning objectives
- Tutustut käsitteisiin informaatio, data, ja tieto.
- Tutustut laajennettuun ASCII-merkistöön ja datan esittämiseen bittijonoina.
- Ymmärrät tietokoneelle mahtuvan datan määrän ja hahmotat internetissä olevan datan määrän.
- Tunnet käsitteen pseudosatunnaisuus ja osaat kirjoittaa ohjelmia, jotka luovat ja käyttävät satunnaislukuja.
Yllä oleva tekstikappale sisältää kirjaimia ja välilyöntejä, jotka tietyssä järjestyksessä ollessaan muodostavat tulkittavan kokonaisuuden. Mikäli tekstistä poistetaan siihen liittyvä järjestys, eli toisin sanoen tekstin merkkien järjestys satunnaistetaan, ei tekstin tulkinta ainakaan kirjoittajan tarkoittamalla tavalla ole tyypillisesti mahdollista. Kokeile painaa yllä olevaa tekstikappaletta hiiren napilla. Huomaat miten järjestys mahdollistaa asioiden ymmärtämisen ja tulkinnan.
Käsitteellä informaatio tarkoitetaan järjestystä, johon voidaan liittää tulkinta.
Käsitteellä informaatio tarkoitetaan asioiden järjestystä, johon voidaan liittää tulkinta. Satunnaistakin järjestystä voi yrittää tulkita, eikä satunnaisuus automaattisesti tarkoita tilannetta, missä satunnaisessa järjestyksessä olevat asiat eivät olisi tulkittavissa. Esimerkiksi sanan "ilta" kirjaimet voi järjestää monella tavalla niin, että lopputulos muodostaa jonkin merkityksellisen sanan. Voit muuttaa alla olevan sanan "ilta" kirjainten järjestystä satunnaiseksi sanaa klikkaamalla. Tarpeeksi monta kertaa kokeilemalla huomaat, että merkeistä "i", "l", "t", ja "a" voidaan muodostaa useita Suomen kielen sanoja, kuten "ilta", "tali", "tila", "lait" ja "liat".
Question not found or loading of the question is still in progress.
Yksittäiset asiat ja käsitteet kuten merkit ovat dataa. Data voi olla esimerkiksi ääntä, numeroita, merkkejä, tai sanoja. Dataa voidaan muuntaa muodosta toiseen. Esimerkiksi tietokoneen sisällä kaikki data esitetään binäärilukuina (ykkösinä ja nollina), ja data muunnetaan sen käsittelyyn tarkoitetulla ohjelmalla haluttuun muotoon, esimerkiksi merkeiksi, kuviksi tai vaikkapa PDF-dokumenteiksi.
Tietokoneissa merkkejä (esimerkiksi aakkosia) voidaan esittää useassa eri muodossa. Eräs tällainen muoto on laajennettu ASCII-merkistö (jatkossa ASCII-merkistö), missä kukin merkki tallennetaan kahdeksaa bittiä käyttäen. Esimerkiksi kirjainta 'A' vastaa kahdeksan bittiä sisältävä bittijono '01000001' ja kirjainta 'B' vastaa bittijono '01000010'. Merkkijonojen muodostaminen tapahtuu liittämällä bittijonot yhteen -- esimerkiksi merkkijono 'AB' koostuu bittijonosta '0100000101000010'. Bittijono tulkitaan ASCII-merkistön kautta kahdeksan bitin kokoisina osina.
ASCII-merkistö
Alkuperäinen ja oikea ASCII-merkistö oli 7-bittinen merkistö, missä jokaista merkkiä vastasi 7 bitin merkkijono. Tässä materiaalissa käsitellään lyhyesti 8-bitin versiota, joka on alkuperäisen ASCII-merkistön laajennus.
Voit kokeilla alla miten merkit muuntuvat ASCII-merkistön bittijonoiksi.
merkki | binääriesitys |
---|
Koska kunkin merkin kuvaamiseen käytetään kahdeksaa bittiä, on laajennettu ASCII-merkistö kooltaan rajattu. Kahdeksan bitin avulla voidaan esittää korkeintaan 256 eri vaihtoehtoa (28).
Käytännössä laajennettu ASCII-merkistö sisältää vain tietyt merkit, jotka on sovittu merkistöä kehitettäessä. Vastinetta kaikille merkeille ei ole. Huomaat tämän esimerkiksi kokeilemalla yllä onnea kuvaavan kanjin 幸 (Kō) muuntamista laajennetun ASCII-merkistön bittijonoksi.
Question not found or loading of the question is still in progress.
Siinä missä käsite informaatio tarkoittaa järjestystä ja käsite data yksittäisiä asioita ja merkkejä, käsite tieto tarkoittaa dataan liittyvää informaatiota, johon voidaan liittää merkitys. Tietoa on esimerksi se, että tietyssä merkistössä 't' vastaa bittijonoa '01110100', ja toisinpäin, eli bittijono '01110100' vastaa kirjainta 't'.
Tieto tarkoittaa dataan liittyvää informaatiota, johon voidaan liittää merkitys.
Tieto on tyypillisesti kontekstisidonnaista, ja siihen liittyy usein säännönmukaisuuksia. ASCII-merkistössä kukin bittijono vastaa tiettyä lukua, joka vastaa tiettyä kirjainta -- esimerkiksi kirjainta 'a' vastaa bittijono '01100001', jota vastaa lukua 97. Vastaavasti kirjainta 'b' vastaa bittijono '01100010', joka vastaa lukua 98.
Voit kokeilla alla ASCII-merkistön muunnoksia numeroista merkeiksi ja bittijonoksi eli binääriesitykseksi. Kahdeksan bitin merkistö sisältää vastineet luvuille nollasta kahteensataanviiteenkymmeneen viiteen (28). Kokeile ainakin mitä kirjaimia luvut 99 ja 100 vastaavat. Huomaat myös, että osa näistä merkeistä on sellaisia, että niille ei löydy selkeästi näytettävää vastinetta -- esimerkiksi luku 27 vastaa Esc-napin painallusta.
merkki | |
---|---|
binääriesitys |
Vaikka ASCII-merkistössä kukin merkki vastaa tiettyä bittijonoa, ei yksittäisellä merkillä ole aina merkitystä. Tässäkin tapauksessa merkitys muodostuu asettamalla kirjaimia peräkkäin sopivassa järjestyksessä. Vastaavasti voidaan ajatella, että yksittäisellä sanallakaan ei ole aina merkitystä -- se miten sana tulkitaan riippuu myös yhteydestä, missä sana esiintyy -- esimerkiksi sanan ympärillä olevista muista sanoista. Tämä hierarkia kuvastaa hyvin informaation, datan ja tiedon suhdetta.

Puhekielessä termien data ja tieto välillä ei ole kovin vahvaa rajanvetoa, osittain myös koska termien käyttö eri kielten välillä vaihtelee. Esimerkiksi myöhemmin tällä kurssilla käsiteltävä tietokanta on englanniksi database.
Datan määrä
Dataa on maailmassa hyvin paljon. Tietokoneiden yhteydessä yhtä kahdeksan bitin bittijonoa kutsutaan tavuksi. Käsite tavu esiintyy muunmuassa kiintolevyjen kokoa sekä muistiin mahtuvaa tilaa kuvattaessa. Tuhatta tavua kutsutaan kilotavuksi, miljoonaa tavua megatavuksi, miljardia tavua gigatavuksi, ja biljoonaa tavua eli tuhatta miljardia tavua teratavuksi.
Nykyaikaisen tietokoneen kiintolevylle mahtuu gigatavuja ellei teratavuja dataa, ja tietokoneen muistiinkin mahtuu tyypillisesti gigatavuja dataa. Tietokoneen kiintolevylle asetettavat asiat ovat käytössä myös tietokoneen uudelleenkäynnistyksen jälkeen, kun taas tietokoneen muistissa olevat asiat katoavat viimeistään tietokoneen uudelleenkäynnistyksen yhteydessä. Kirjoittaessamme omia ohjelmia Johdatus ohjelmointiin -kurssilla muuttujat ja niiden arvot sijaitsivat muistissa, josta ne katosivat aina viimeistään ohjelman suorituksen päättyessä.
Yhden teratavun kokoiselle kiintolevylle mahtuu noin biljoona tavua eli noin biljoona ASCII-merkistön merkkiä. Mikäli nämä biljoona merkkiä tulostettaisiin paperille peräkkäin siten, että kunkin merkin leveys olisi yksi millimetri, olisi tulostettu paperi niin pitkä, että sen saisi vedettyä maapallon ympäri kaksikymmentäviisi kertaa.
On oikeastaan ällistyttävää kuinka pieneen tilaan tällainen määrä dataa saadaan mahtumaan. Nykyisissä kannettavissa tietokoneissa olevat "2.5 tuumaiset" kiintolevyt ovat noin 2.7 tuumaa leveitä, 0.37 tuumaa korkeita, ja 3.96 tuumaa pitkiä. Metrisessä järjestelmässä näiden mittojen vastine on noin 6.9 senttiä, 0.9 senttiä, ja 10 senttiä -- yhden tällaisen kiintolevyn tilavuus on siis noin 62 kuutiosenttiä (eli 62 millilitraa, alle desilitran!). Tällaiseen tilaan mahtuu nykyään useampia teratavuja.
Question not found or loading of the question is still in progress.
Sitä mukaa kun kiintolevyjen kapasiteetti eli kiintolevyille mahtuvan datan määrä on kasvanut, on myös tallennettavan datan määrä kasvanut ja muu teknologia kehittynyt. Tämä näkyy esimerkiksi kuvien ja videoiden laadussa. Siinä missä vuonna 2000 julkaistun kännykkäkameran tarkkuus oli noin 0,11 megapikseliä eli noin 110000 yksittäistä pistettä, nykyisissä kännyköissä olevissa kameroissa tarkkuus on jopa satoja megapikseleitä. Tämän lisäksi muunmuassa väritiedon tallennus on parantunut merkittävästi.
Kun tarkastelemme vielä verkossa toimivien yhteisöpalvelujen tallentamaa ja käsittelevää dataa, voimme toistaa toteamuksemme -- dataa on maailmassa hyvin paljon. Esimerkiksi -- Omnicoren -- mukaan Instagramiin lisätään päivittäin yli sata miljoonaa kuvaa ja videota. Vastaavasti YouTubeen lähetetään joka minuutti noin 500 tunnin edestä videomateriaalia, jonka lisäksi joka päivä katsotaan noin 5 miljardia YouTube-videoa. Tämä määrä on jatkuvassa kasvussa.
Satunnaisuus
Määrittelimme edellä käsitteen informaatio asioiden järjestyksenä. Toisinpäin käännettyn ä, täysin satunnaisessa järjestyksessä olevassa sisällössä ei ole käytännössä informaatiota. Informaation ja sen puuttumisen voi havainnoida arkielämässä esimerkiksi radiota kuuntelemalla tai televisiota katsomalla. Kun valitset radiosta taajuuden, johon yksikään radioasema ei lähetä signaalia, kuulet kohinaa. Vastaavasti, kun virität television, televisio etsii tv-signaalia käytössä olevista taajuuksista. Sellaiset taajuudet, joista tv-signaalia ei löydy, ovat tyypillisesti kohinaisia ja niiden sisältö näkyy "lumisateena".
Tutustutaan tässä satunnaisuuden luomiseen ja käyttöön tietokoneohjelmissa. Johdatus ohjelmointiin -kurssilla opimme, että listalla olevat arvot voi asettaa satunnaiseen järjestykseen listan shuffle
-metodilla. Käytimme tätä eräässä esimerkissä lottorivin arpomiseen tarkoitettuun ohjelmaan. Ohjelma on kuvattuna alla.
main() {
var lista = [];
for (var i = 1; i <= 40; i++) {
lista.add(i);
}
lista.shuffle();
print('Lottonumerot:');
for (var i = 0; i < 7; i++) {
print(lista[i]);
}
}
program output
Lottonumerot: 31 14 33 20 18 11 22
Satunnaisuus perustuu tietokoneohjelmissa satunnaislukuja luovien ohjelmien käyttöön. Tällaiset ohjelmat käyttävät jonkinlaista algoritmia, joka luo pseudosatunnaislukuja eli lukuja, jotka vaikuttavat satunnaisilta, mutta eivät todellisuudessa ole satunnaisia. Taustalla on algoritmi, joka noudattaa sääntöjä, joita luotavat luvutkin noudattavat.
Täysin satunnaisia lukuja
Näennäisesti täysin satunnaisten lukujen luominen tietokoneiden avulla on toki mahdollista. Tällöin käytetään tyypillisesti jonkinlaista lisäosaa, joka hyödyntää tosimaailmassa esiintyviä ilmiöitä. Eräs esimerkki tällaisesta satunnaislukujen luomiseen tarkoitetusta välineestä on lotosta ja kenostakin tuttu pingispallojen sekoittaja. Sekoittaja sekoittaa numeroidut pallot puhaltimen ja puhalluksesta johtuvan pallojen kimpoilun avulla. Lopulta satunnainen järjestys saadaan keräämällä numeroidut pallot jonkinlaiseen putkiloon. Tietokoneen prosessoreissakin on nykyään tuki satunnaislukujen luomiseen -- tällaiset menetelmät perustuvat esimerkiksi tietokoneen sisäisen kellon kellotaajuuden vaihteluiden hyödyntämiseen.
Dart tarjoaa apuvälineitä pseudosatunnaislukujen (jatkossa satunnaislukujen) luomiseen. Kirjastosta dart:math
, joka tuodaan käyttöön komennolla import 'dart:math';
, löytyy satunnaislukujen luomiseen tarkoitettu Random
-luokka (eli "kapseloitu pakkaus toiminnallisuutta").
Alla olevassa ohjelmassa ohjelman käyttöön tuodaan kirjasto dart:math
. Ohjelmassa luodaan Random
-luokan ilmentymä (eli olio) komennolla var arpoja = Random();
. Nyt muuttujassa arpoja
on Random
-luokasta tehty olio, jonka kautta käytetään Random
-luokkaan kapseloitua toiminnallisuutta. Lause var luku = arpoja.nextDouble();
luo välillä [0, 1[ olevan satunnaisluvun, joka asetetaan muuttujaan luku
. Lopulta satunnaisluku tulostetaan.
Kokeile ohjelman suorittamista.
Alla on muutamia esimerkkejä ohjelman tulostamista luvuista. Mikäli suoritat ohjelman, on hyvin epätodennäköistä että ohjelma tulostaa jomman kumman alla olevista numeroista.
program output
0.8412873393200226
program output
0.43595952604788724
Lauseke arpoja.nextDouble()
kutsuu käytännössä luokasta Random
luodun arpoja
-nimisen olion metodia nextDouble()
. Kyseinen metodi sisältää lähdekoodia, jota emme näe. Metodin lähdekoodin suorittaminen palauttaa satunnaisen luvun nollan ja yhden väliltä siten, että arvo ei ole koskaan yksi (mutta arvo voi olla nolla).
Tietokoneella luodut satunnaiset luvut eivät ole mielivaltaisia, vaan ne noudattavat tilastollisia lakeja. Aivan samalla tavalla kuin kuusisivuisen nopan heitossa kunkin sivun saamisen todennäköisyys on sama eli yksi kuudesta, on satunnaislukujen luomisessa kunkin luvun todennäköisyys (ainakin lähes) sama.
Tätä tietoa hyödyntämällä voimme luoda ohjelman, joka tulostaa esimerkiksi 70% todennäköisyydellä jotain, ja 30% todennäköisyydellä jotain muuta. Konkreettisesti tämä tehdään niin, että luomme satunnaisluvun ja tarkastelemme sitä ehtolauseen avulla. Mikäli satunnaisluvun arvo on pienempi kuin 0.7 (70% todennäköisyys), tehdään jotain, ja muulloin jotain muuta (30% todennäköisyys).
Alla oleva ohjelma tulostaa 70% todennäköisyydellä viestin "Huomenna paistaa aurinko." ja 30% todennäköisyydellä viestin "Huomenna sataa.".
import 'dart:math';
main() {
var arpoja = Random();
var luku = arpoja.nextDouble();
if (luku < 0.7) {
print('Huomenna paistaa aurinko.');
} else {
print('Huomenna sataa.');
}
}
program output
Huomenna paistaa aurinko.
Voimme vastaavasti tehdä ohjelman, joka ilmoittaa sään olevan aurinkoinen 50% todennäköisyydellä, sään olevan pilvinen 20% todennäköisyydellä, ja sään olevan sateinen 30% todennäköisyydellä.
import 'dart:math';
main() {
var arpoja = Random();
var luku = arpoja.nextDouble();
if (luku < 0.5) {
print('Huomenna paistaa aurinko.');
} else if (luku < 0.7) {
print('Huomenna on pilvistä.');
} else {
print('Huomenna sataa.');
}
}
program output
Huomenna sataa.
Question not found or loading of the question is still in progress.
Alla olevassa esimerkissä satunnaislukujen luomiseen tarkoitettua Random
-luokasta tehtyä arpoja
-oliota käytetään toistolauseessa. Ohjelma tulostaa jokaiselle viikonpäivälle oman sääennusteensa. Ohjelmassa kunakin viikonpäivänä sataa 40% todennäköisyydellä ja on aurinkoista 60% todennäköisyydellä.
import 'dart:math';
main() {
var arpoja = Random();
var paivat = [];
paivat.add('Maanantai');
paivat.add('Tiistai');
paivat.add('Keskiviikko');
paivat.add('Torstai');
paivat.add('Perjantai');
paivat.add('Lauantai');
paivat.add('Sunnuntai');
for (var i = 0; i < paivat.length; i++) {
var paiva = paivat[i];
var luku = arpoja.nextDouble();
var ennuste = 'aurinkoista';
if (luku < 0.4) {
ennuste = 'sateista';
}
print('$paiva: $ennuste.');
}
}
program output
Maanantai: aurinkoista. Tiistai: sateista. Keskiviikko: aurinkoista. Torstai: aurinkoista. Perjantai: aurinkoista. Lauantai: aurinkoista. Sunnuntai: aurinkoista.
Mikäli ohjelmassa haluaa käyttää satunnaisesti luotuja kokonaislukuja, löytyy tätä varten Random
-luokasta erillinen metodi nextInt
. Metodille nextInt
annetaan parametrina luku, joka toimii ylärajana: metodin kutsuminen palauttaa satunnaisen kokonaisluvun väliltä [0, yläraja[ eli nollasta ylärajaan, poislukien ylärajan.
Alla oleva ohjelma luo satunnaisen luvun välillä 0-5 (5 mukaanluettuna).
program output
3
program output
5
Question not found or loading of the question is still in progress.
Metodin nextInt
palauttama arvo on arvo siinä missä mikä tahansa muukin arvo, ja sitä voi käyttää esimerkiksi osana laskentaa. Alla olevassa esimerkissä simuloidaan kuusisivuisen nopan heittoa ja tulostetaan satunnainen luku välillä [1, 7[ eli luku yhdestä kuuteen. Satunnaisen luvun valinta väliltä [1, 7[ onnistuu lisäämällä luku yksi väliltä [0, 6[ valittuun lukuun.
import 'dart:math';
main() {
var arpoja = Random();
var luku = 1 + arpoja.nextInt(6);
print(luku);
}
program output
4
program output
6
Puhuimme aiemmin siitä, että satunnaiset luvut noudattavat tilastollisia lakeja. Tarkastellaan tätä vielä konkreettisen esimerkin kautta. Alla oleva ohjelma arpoo kymmenentuhatta lukua väliltä [0, 3[ ja laskee kunkin luvun ilmentymien lukumäärän.
Eräs mahdollinen tulostus on seuraava.
program output
3315 3375 3310
Kun suoritat yllä olevaa ohjelmaa uudestaan ja uudestaan, huomaat että havaittujen lukujen lukumäärät ovat melko tasaisesti jakautuneita. Tähän havaintoon liittyy käsite suurten lukujen laki. Esimerkkiimme sovellettuna suurten lukujen laki tarkoittaa sitä, että mitä useamman kerran satunnaisen luvun valitsee, sitä lähemmäksi todennäköisyyttä havainnot yhdessä asettuvat. Yllä kukin luvuista 0, 1, ja 2 esiintyy noin 33.3% todennäköisyydellä, mikä heijastuu myös lopputuloksessa. Kokeile miten ohjelman toiminta muuttuu mikäli vaihdat arvottavien lukujen lukumääräksi ensin kymmenen (10) ja sitten miljoona (1000000).
Uhkapelien kuten lotto ja kolikkoautomaatit toiminta perustuu suurten lukujen lakiin. Uhkapelit on toteutettu siten, että osa pelaajista voittaa ja osa häviää, mutta pitkällä tähtäimellä ensisijainen voittaja on uhkapelien järjestäjä. Uhkapeleillä on palautusprosentti, joka määrää kuinka suuri osa pelatusta rahasta palautetaan pelaajille. Esimerkiksi lotossa palautusprosentti on noin 40, kun raha-automaateissa palautusprosentti on tyypillisesti suurempi (mutta pienempi kuin 100).
Vaikka esimerkiksi lotossa pääpalkinnot ovat isoja, konkreettiset voittotodennäköisyydet ovat pieniä. Alla oleva ohjelma kuvastaa loton palautusprosenttia pelillä, missä pelaaja pelaa euron panoksilla. Euron häviää 60% todennäköisyydellä, ja pelatun euron voittaa takaisin 40% todennäköisyydellä. Peli päättyy kun rahat loppuvat.
Yllä olevan pelin palautusprosentti on sama kuin lotossa, mutta peliä pelattaessa huomaa että rahat hupenevat melko nopeasti. Peliä voisi muuttaa houkuttavammaksi esimerkisi toteuttamalla pelistä version, missä pelaaja voittaa kaksikymmentä euroa 1% todennäköisyydellä, viisi euroa 2% todennäköisyydellä, ja yhden euron 10% todennäköisyydellä. Lopputulos on kuitenkin sama: pelaamalla häviää rahansa.
Olemme edellä tutustuneet satunnaisuuden käyttöön ohjelmissa. Tutustutaan seuraavaksi dataan ja siitä kerättävään tietoon. Toteutamme tehtävävetoisesti peliin käyttäjän aiempia valintoja (dataa) hyödyntävän "tekoälyn", joka päättelee käyttäjän aiemmista valinnoista seuraavan oman valintansa (eli näennäisesti muodostaa tietoa).
Pelin idea on yksinkertainen: käyttäjältä kysytään lukua (joko 0 tai 1) ja tietokoneen pitää arvata mitä käyttäjä syötti. Mikäli tietokone arvaa oikein, eli valitsee saman luvun kuin minkä käyttä syötti, tietokone voittaa. Muulloin pelaaja voittaa.
Lähtökohtana tekoälylle on alla kuvattu ohjelma, missä tietokone valitsee aina luvun 1.
Yllä olevassa tehtäväsarjassa hahmotellaan ohjelmaa, joka näennäisesti oppii käyttäjän syötteistä. Edellä toteutetut strategiat eli valitaan aina käyttäjän viimeinen valinta ja valitaan eniten esiintynyt luku ovat hyviä lähtökohtia oppivalle ohjelmalle. Pelaajia jo hieman voittavan ohjelman voi toteuttaa edellä kuvattua ajatusta laajentaen.
Alla olevassa pelissä on täysin sama lähtökohta ja logiikka kuin yllä olevissa tehtävissä. Valitse-funktion toiminnallisuus on kuitenkin hieman laajempi. Ohjelma käytännössä säilöö valintasi ja muodostaa siitä -- valintojesi järjestystä hyödyntämällä -- "tietoa", jota ohjelma käyttää tietokoneen valinnoissa. Pelaa peliä kunnes jommalla kummalla on 20 voittoa -- voitatko tietokoneen?
Arvauspeli!
Valitse 0 tai 1. Jos tietokone valitsee saman luvun, tietokone voittaa kierroksen. Muulloin sinä voitat kierroksen.
Viimeinen oma valinta: -
Viimeinen tietokoneen valinta: -
Pelaajan voittoja: 0
Tietokoneen voittoja: 0
Hi! Please help us improve the course!
Please consider the following statements and questions regarding this part of the course. We use your answers for improving the course.
I can see how the assignments and materials fit in with what I am supposed to learn.
I find most of what I learned so far interesting.
I am certain that I can learn the taught skills and knowledge.
I find that I would benefit from having explicit deadlines.
I feel overwhelmed by the amount of work.
I try out the examples outlined in the materials.
I feel that the assignments are too difficult.
I feel that I've been systematic and organized in my studying.
How many hours (estimated with a precision of half an hour) did you spend reading the material and completing the assignments for this part? (use a dot as the decimal separator, e.g 8.5)
How would you improve the material or assignments?