Slump
I den här delen ser vi på modulen random
som finns i Pythons standardbibliotek. Den här modulen innehåller funktioner som gör det möjligt att arbeta med slump i program, till exempel för att skapa slumptal, blanda ordningen på elementen i en datastruktur eller plocka ut slumpmässigt valda element.
Delarna i den här modulen innehåller flera länkar till standardbibliotekets dokumentation. Kolla gärna upp länkarna så att du kan bekanta dig med hur dokumentationen ser ut.
Skapa slumptal
Funktionen randint(a, b)
returnerar ett slumptal mellan a
och b
(inklusive start- och slutpunkten). Det här programmet fungerar till exempel som en normal tärning:
from random import randint
print("Tärningen visar:", randint(1, 6))
Så här kan utskriften se ut:
Tärningen visar: 4
Det här programmet kastar en tärning tio gånger:
from random import randint
for i in range(10):
print("Tärningen visar:", randint(1, 6))
Utskriften skulle kunna se ut så här:
Tärningen visar: 5 Tärningen visar: 4 Tärningen visar: 3 Tärningen visar: 2 Tärningen visar: 3 Tärningen visar: 4 Tärningen visar: 6 Tärningen visar: 4 Tärningen visar: 4 Tärningen visar: 3
Obs! Det är värt att notera att funktionen randint
fungerar lite olikt än till exempel extrahering (slicing) eller range
-funktionen. Funktionsanropet randint(1, 6)
resulterar i ett tal mellan 1 och 6, medan anropet range(1, 6)
resulterar i ett intervall som innehåller värdena 1 till 5.
Fler funktioner relaterade till slumpmässighet
Funktionen shuffle
blandar elementen i den datastruktur som ges som argument. Till exempel blandar följande program ordningen i en lista med ord:
from random import shuffle
ord = ["apa", "banan", "cembalo"]
shuffle(ord)
print(ord)
['banan', 'apa', 'cembalo']
Funktionen choice
returnerar ett slumpmässigt valt element ur en datastruktur:
from random import choice
ord = ["apa", "banan", "cembalo"]
print(choice(ord))
'cembalo'
Lottorad
Ett vanligt sätt att undersöka slumpmässighet är att se på lottorader. Låt oss lotta ut en vinnande rad. I Finland består lottoraden av sju siffror mellan 1 och 40.
Så här skulle det kunna se ut om vi försöker lotta ut en rad:
from random import randint
for i in range(7):
print(randint(1, 40))
Det här skulle inte fungera i det långa loppet eftersom ett och samma nummer kan dyka upp flera gånger på samma lottorad. Vi måste se till att alla nummer som dras är unika.
Ett sätt är att lagra de dragna siffrorna i en lista. Då lägger vi bara till ett draget nummer om det inte redan finns i listan. Vi använder oss av en loop som fortsätter tills listans längd är sju, dvs. vi har dragit sju unika lottonummer:
from random import randint
rad = []
while len(rad) < 7:
ny = randint(1, 40)
if ny not in rad:
rad.append(ny)
print(rad)
Vi kan också spara lite utrymme genom att använda shuffle
-funktionen:
from random import shuffle
alla = list(range(1, 41))
shuffle(alla)
rad = alla[0:7]
print(rad)
Hur fungerar det här? Idén är att vi skapar en lista med talen 1 till 40, på samma sätt som vi har 40 bollar i en lottomaskin. Efter att listan har blandats kan de första sju siffrorna utgöra veckans vinnande rad, på samma sätt som de första sju bollarna som plockas ur maskinen. Nu behövs alltså ingen loop, utan vi kan direkt plocka ut de sju första talen ur den blandade listan.
Modulen random
innehåller faktiskt ett ännu enklare sätt att skapa vår lottorad: funktionen sample
. Den returnerar ett givet antal slumpmässigt valda element ur en given datastruktur, i det här fallet sju tal ur en lista med talen 1-40:
from random import sample
alla = list(range(1, 41))
rad = sample(alla, 7)
print(rad)
Varifrån kommer slumptalen?
Datorer skapar slumptal med hjälp av en matematisk formel. För att resultatet inte ska bli samma varje gång används ett så kallat frö (engelska: seed) som startvärde. Frövärdet tas ofta från systemtiden, dvs. vad datorns interna klocka visar när slumpgeneratorn körs.
Funktionaliteten i random
-modulen är baserad på denna typ av algoritm. Vi kan också själva ange startvärdet med seed
-funktionen:
from random import randint, seed
seed(1337)
# följande instruktion genererar nu alltid samma tal
print(randint(1, 100))
Då vi själva anger seed
-värdet kommer funktionen att ge samma resultat varje gång den körs. Resultatet kan skilja sig mellan olika Python-versioner, men i grunden kommer slumpmässigheten att försvinna då vi definierar seed-värdet. Funktionaliteten kan dock vara nyttig då vi exempelvis testar program.
Log in to view the quiz
Se dina poäng genom att klicka på cirkeln nere till höger av sidan.