Funkcije choice(), sample() i choices() u random modulu standardne biblioteke Python mogu se koristiti za nasumični odabir i dohvaćanje elemenata s popisa, torke, niza ili drugog objekta sekvence (slučajno uzorkovanje).
choice() dobiva jedan element, sample() i choices() dobivaju popis više elemenata. sample() je nepovratna ekstrakcija bez duplikata, choices() je nadoknadiva ekstrakcija s duplikatima.
Ovdje su navedene sljedeće informacije.
- Odaberite jedan element nasumično.:
random.choice()
- Nasumično odaberite više elemenata (bez duplikata):
random.sample()
- Nasumično odaberite više elemenata (s duplikatima):
random.choices()
- Popravite nasumični broj
Odaberite jedan element nasumično.:random.choice()
Uz funkciju select() modula random, jedan element se nasumično odabire s popisa i može se dohvatiti.
import random
l = [0, 1, 2, 3, 4]
print(random.choice(l))
# 1
Isto vrijedi i za tuple i nizove. U slučaju nizova, odabire se jedan znak.
print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy
print(random.choice('abcde'))
# b
Pogreška ako je prazan popis, tuple ili niz naveden kao argument.
# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence
Nasumično odaberite više elemenata (bez duplikata):random.sample()
S funkcijom sample() random modula, možete nasumično dobiti više elemenata s popisa. Nema dupliciranja elemenata (nepovratna ekstrakcija).
Prvi argument je popis, a drugi argument je broj elemenata koji se trebaju dohvatiti. Popis se vraća.
import random
l = [0, 1, 2, 3, 4]
print(random.sample(l, 3))
# [2, 4, 0]
print(type(random.sample(l, 3)))
# <class 'list'>
Ako je drugi argument postavljen na 1, također se vraća popis s jednim elementom; ako je postavljeno na 0, popis je prazan. Ako je drugi argument 1, vraća se popis s jednim elementom; ako je 0, vraća se prazna lista; ako je prvi argument veći od broja elemenata na popisu, dolazi do pogreške.
print(random.sample(l, 1))
# [3]
print(random.sample(l, 0))
# []
# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative
Ako je prvi argument tuple ili niz, ono što se vraća je još uvijek popis.
print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']
print(random.sample('abcde', 2))
# ['b', 'e']
Ako se želite vratiti na tuple ili niz, koristite tuple(),join().
print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')
print(''.join(random.sample('abcde', 2)))
# dc
Imajte na umu da se vrijednost ne ocjenjuje, pa ako izvorni popis ili tuple sadrži elemente s istom vrijednošću, postoji mogućnost da će biti odabrana ista vrijednost.
l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
print(random.sample(l_dup, 3))
# [3, 1, 1]
Ako želite izbjeći duple vrijednosti, možete koristiti set() da ga pretvorite u skup (vrsta skupa) i izdvojite samo jedinstvene elemente, a zatim upotrijebite sample().
print(set(l_dup))
# {0, 1, 2, 3}
print(random.sample(set(l_dup), 3))
# [1, 3, 2]
Nasumično odaberite više elemenata (s duplikatima):random.choices()
Funkcija choices() modula random omogućuje vam da nasumično dohvatite više elemenata s popisa, a za razliku od sample(), dopušta odabir dupliciranih elemenata.
choices() je funkcija dodana u Python 3.6. Nije dostupan u ranijim verzijama.
Argument k specificira broj elemenata koji će se dohvatiti. Umnožavanje je dopušteno, tako da broj elemenata za dohvat može biti veći od broja elemenata na izvornom popisu.
Budući da je k argument samo za ključnu riječ, potrebno je navesti ključnu riječ, kao što je 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]
Zadana vrijednost k je 1; ako je izostavljen, vraća se popis s 1 elementom.
print(random.choices(l))
# [1]
Ponderi argumenata mogu se koristiti za određivanje težine (vjerojatnosti) da će svaki element biti odabran, a tip elemenata na popisu može biti int ili 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]
Argument cum_weights također se može navesti kao kumulativna težina. cum_weights u sljedećem uzorku koda ekvivalentan je prvim ponderima iznad.
print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]
Zadana vrijednost za težine argumenata i cum_weights je Ništa, što znači da je svaki element odabran s istom vjerojatnošću.
Ako se duljina (broj elemenata) težine argumenata ili cum_weights razlikuje od izvornog popisa, dolazi do pogreške.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_
Također je pogreška navesti težine i cum_weights u isto vrijeme.
# 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
Naveli smo popis kao prvi argument kao primjer u uzorku koda do sada, ali isto vrijedi i za torke i nizove.
Popravite nasumični broj
Davanjem proizvoljnog cijelog broja funkciji seed(), seed nasumičnih brojeva može se fiksirati i generator slučajnih brojeva se može inicijalizirati.
Nakon inicijalizacije s istim sjemenom, elementi se uvijek biraju na isti način.
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3