Funktionerne choice(), sample() og choices() i random-modulet i Python-standardbiblioteket kan bruges til tilfældigt at udvælge og hente elementer fra en liste, tupel, streng eller et andet sekvensobjekt (tilfældig prøveudtagning).
choice() får et enkelt element, sample() og choices() får en liste med flere elementer. sample() er en udtrækningsmetode uden dubletter, der ikke kan genfindes, choices() er en udtrækningsmetode med dubletter, der kan genfindes.
Her findes følgende oplysninger.
- Vælg et element tilfældigt.:
random.choice()
- Vælg tilfældigt flere elementer (ingen dubletter):
random.sample()
- Vælg tilfældigt flere elementer (med dubletter):
random.choices()
- Fastsæt det tilfældige talfrø
Vælg et element tilfældigt.: random.choice()
Med random-modulets funktion choose() vælges et element tilfældigt fra listen og kan hentes.
import random
l = [0, 1, 2, 3, 4]
print(random.choice(l))
# 1
Det samme gælder for tupler og strenge. I tilfælde af strenge vælges et enkelt tegn.
print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy
print(random.choice('abcde'))
# b
Fejl, hvis en tom liste, tupel eller streng er angivet som et argument.
# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence
Vælg tilfældigt flere elementer (ingen dubletter): random.sample()
Med funktionen sample() i random-modulet kan du få flere tilfældige elementer fra en liste. Der er ingen duplikering af elementer (ikke-genoprettelig udtrækning).
Det første argument er en liste, og det andet argument er antallet af elementer, der skal hentes. Listen returneres.
import random
l = [0, 1, 2, 3, 4]
print(random.sample(l, 3))
# [2, 4, 0]
print(type(random.sample(l, 3)))
# <class 'list'>
Hvis det andet argument er sat til 1, returneres også en liste med ét element; hvis det er sat til 0, er listen tom. Hvis det andet argument er 1, returneres en liste med ét element; hvis det er 0, returneres en tom liste; hvis det første argument er mere end antallet af elementer i listen, opstår der en fejl.
print(random.sample(l, 1))
# [3]
print(random.sample(l, 0))
# []
# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative
Hvis det første argument er en tupel eller en streng, er det, der returneres, stadig en liste.
print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']
print(random.sample('abcde', 2))
# ['b', 'e']
Hvis du vil vende tilbage til en tuple eller en streng, skal du bruge tuple(),join().
print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')
print(''.join(random.sample('abcde', 2)))
# dc
Bemærk, at værdien ikke vurderes, så hvis den oprindelige liste eller tupel indeholder elementer med samme værdi, er der en mulighed for, at den samme værdi vil blive valgt.
l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
print(random.sample(l_dup, 3))
# [3, 1, 1]
Hvis du vil undgå duplikerede værdier, kan du bruge set() til at konvertere den til et sæt (sæt-type) og kun udtrække de unikke elementer og derefter bruge sample().
print(set(l_dup))
# {0, 1, 2, 3}
print(random.sample(set(l_dup), 3))
# [1, 3, 2]
Vælg tilfældigt flere elementer (med dubletter): random.choices()
Random-modulets funktion choices() giver dig mulighed for at hente flere tilfældige elementer fra en liste, og i modsætning til sample() tillader den, at duplikerede elementer kan vælges.
choices() er en funktion, der blev tilføjet i Python 3.6. Den er ikke tilgængelig i tidligere versioner.
Argumentet k angiver antallet af elementer, der skal hentes. Duplikering er tilladt, så antallet af elementer, der skal hentes, kan være større end antallet af elementer i den oprindelige liste.
Da k kun er et nøgleord-argument, er det nødvendigt at angive et nøgleord, f.eks. k=3.
import random
l = [0, 1, 2, 3, 4]
print(random.choices(l, k=3))
# [2, 1, 0]
print(random.choices(l, k=10))
# [3, 4, 1, 4, 4, 2, 0, 4, 2, 0]
Standardværdien for k er 1; hvis den udelades, returneres en liste med 1 element.
print(random.choices(l))
# [1]
Argumentet vægte kan bruges til at angive vægten (sandsynligheden) for, at hvert element vil blive valgt, og typen af elementerne i listen kan være int eller float.
print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1]))
# [0, 2, 3]
print(random.choices(l, k=3, weights=[1, 1, 0, 0, 0]))
# [0, 1, 1]
Argumentet cum_weights kan også angives som en kumulativ vægt. cum_weights i den følgende kodeeksempel svarer til den første vægt ovenfor.
print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]
Standardværdien for både argumenter weights og cum_weights er None, hvilket betyder, at hvert element vælges med den samme sandsynlighed.
Hvis længden (antallet af elementer) af argumentet weights eller cum_weights er forskellig fra den oprindelige liste, opstår der en fejl.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_
Det er også en fejl at angive vægte og cum_weights på samme tid.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1], cum_weights=[1, 2, 3, 13, 14]))
# TypeError: Cannot specify both weights and cumulative weights
Vi har angivet en liste som det første argument som et eksempel i kodeeksemplet indtil videre, men det samme gælder for tupler og strings.
Fastsæt det tilfældige talfrø
Ved at give et vilkårligt heltal til random-modulets funktion seed(), kan tilfældige talfrø fastsættes, og generatoren af tilfældige tal kan initialiseres.
Efter initialisering med det samme frø udvælges elementerne altid på samme måde.
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3