Osa 7

Satunnaisuus

Tässä luvussa tutustutaan standardikirjaston moduuliin random, joka tarjoaa välineistöä satunnaislukujen generointiin ja muuhun satunnaiseen toiminnallisuuteen.

Tässä ja seuraavissa luvuissa esiteltävien funktioiden yhteyteen on lisäilty linkkejä standardikirjaston dokumentaatioon. Linkkejä kannattaa klikkailla ja pikkuhiljaa totutella siihen, miltä dokumentaatio näyttää.

Luvun arpominen

Funktio randint(a, b) antaa satunnaisen kokonaisluvun väliltä a...b. Esimerkiksi seuraava ohjelma simuloi nopan heittämistä:

from random import randint

print("Noppa antaa:", randint(1, 6))

Ohjelman tulos voisi olla vaikkapa:

Esimerkkitulostus

Noppa antaa: 4

Seuraava ohjelma puolestaan heittää noppaa kymmenen kertaa:

from random import randint

for i in range(10):
    print("Noppa antaa:", randint(1, 6))

Ohjelman tulos voisi olla seuraava:

Esimerkkitulostus

Noppa antaa: 5 Noppa antaa: 4 Noppa antaa: 3 Noppa antaa: 2 Noppa antaa: 3 Noppa antaa: 4 Noppa antaa: 6 Noppa antaa: 4 Noppa antaa: 4 Noppa antaa: 3

Huomaa, että funktio randint toimii eri logiikalla kuin aiemmin käyttämämme funktio range, joka luo lukuvälin. Kun kutsumme funktiota randint(1, 6), lukuväli on 1...6, mutta kun kutsumme funktiota range(1, 6), lukuväli on 1...5.

Lisää funktioita

Funktio shuffle sekoittaa sille annetun tietorakenteen. Esimerkiksi seuraava ohjelma sekoittaa listalla olevat sanat:

from random import shuffle

sanat = ["apina", "banaani", "cembalo"]
shuffle(sanat)
print(sanat)
Esimerkkitulostus

['banaani', 'apina', 'cembalo']

Funktio choice puolestaan valitsee satunnaisen alkion tietorakenteesta:

from random import choice

sanat = ["apina", "banaani", "cembalo"]
print(choice(sanat))
Esimerkkitulostus

'cembalo'

Lottorivin arvonta

Tarkastellaan esimerkkinä tilannetta, jossa haluamme arpoa lottorivin. Lotossa on yhteensä 40 numeroa, joista arvotaan 7 numeroa riviin.

Yksinkertainen tapa koettaa arpoa lottorivi on seuraava:

from random import randint

for i in range(7):
    print(randint(1, 40))

Tämä ei ole kuitenkaan toimiva tapa, koska sama numero saattaa tulla useita kertoja riviin. Tarvitsemme jonkin menetelmän, joka varmistaa, että jokainen numero on eri numero.

Yksi mahdollisuus on tallentaa arvotut numerot listaan ja lisätä uusi numero listaan vain, jos sitä ei vielä ole siellä. Voimme jatkaa tätä, kunnes listassa on 7 numeroa:

from random import randint

rivi = []
while len(rivi) < 7:
    uusi = randint(1, 40)
    if uusi not in rivi:
        rivi.append(uusi)

print(rivi)

Voimme kuitenkin toteuttaa arvonnan myös lyhyemmin funktion shuffle avulla:

from random import shuffle

kaikki = list(range(1, 41))
shuffle(kaikki)
rivi = kaikki[0:7]
print(rivi)

Tässä ideana on, että luomme ensin listan, jossa on kaikki numerot väliltä 1–40. Tämän jälkeen sekoitamme listan ja valitsemme sitten 7 ensimmäistä numeroa riviin. Tämän ansiosta meidän ei tarvitse tehdä silmukkaa.

Itse asiassa voimme toteuttaa arvonnan vielä helpommin, koska Pythonin standardikirjastossa on myös funktio sample, joka valitsee annetusta tietorakenteesta halutun määrän alkioita:

from random import sample

kaikki_luvut = list(range(1, 41))
rivi = sample(kaikki_luvut, 7)
print(rivi)
Loading

Mistä satunnaisluvut tulevat?

Moduulin random toiminta perustuu algoritmiin, joka tuottaa satunnaislukuja tietyn lähtöarvon ja matemaattisten operaatioiden avulla. Lähtöarvoa kutsutaan myös nimellä siemenarvo (engl. seed value).

Voimme halutessamme antaa siemenarvon itse funktiolla seed:

from random import randint, seed

seed(1337)
# tästä tulee aina sama satunnaisluku
print(randint(1, 100))

Kun annamme siemenarvon itse, satunnaisuutta käyttävät funktiot antavat samat tulokset ohjelman jokaisella suorituskerralla. Kuitenkin tulokset voivat riippua käytetystä Pythonin versiosta.

Loading
Loading
Loading
Loading
:
Loading...
:
Loading...

Kirjaudu sisään nähdäksesi tehtävän.

Seuraava osa: