A Python szabványos könyvtár random moduljának choice(), sample() és choices() függvényei arra használhatók, hogy véletlenszerűen válasszunk ki és vegyünk ki elemeket egy listából, tuple-ból, stringből vagy más szekvenciaobjektumból (véletlen mintavétel).
A choice() egyetlen elemet kap, a sample() és a choices() több elemet tartalmazó listát kap. a sample() nem helyreállítható kivonatolás duplikátumok nélkül, a choices() helyreállítható kivonatolás duplikátumokkal.
A következő információk itt találhatók.
- Válasszon ki véletlenszerűen egy elemet.:
random.choice()
- Több elem véletlenszerű kiválasztása (duplikátumok nélkül):
random.sample()
- Több elem véletlenszerű kiválasztása (duplikátumokkal):
random.choices()
- A véletlen számok magjának rögzítése
Válasszon ki véletlenszerűen egy elemet.: random.choice()
A random modul choose() függvényével egy elemet véletlenszerűen választunk ki a listából, és az lekérdezhető.
import random
l = [0, 1, 2, 3, 4]
print(random.choice(l))
# 1
Ugyanez vonatkozik a tuplikra és a karakterláncokra is. A karakterláncok esetében egyetlen karaktert választunk ki.
print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy
print(random.choice('abcde'))
# b
Hiba, ha üres lista, tuple vagy string van megadva argumentumként.
# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence
Több elem véletlenszerű kiválasztása (duplikátumok nélkül): random.sample()
A random modul sample() függvényével véletlenszerűen több elemet kaphatunk egy listából. Az elemek megkettőzése (nem helyreállítható kivonás) nem történik.
Az első argumentum egy lista, a második pedig a lekérdezendő elemek száma. A lista visszaküldésre kerül.
import random
l = [0, 1, 2, 3, 4]
print(random.sample(l, 3))
# [2, 4, 0]
print(type(random.sample(l, 3)))
# <class 'list'>
Ha a második argumentum értéke 1, akkor egy egyelemű listát kapunk vissza; ha 0, akkor a lista üres. Ha a második argumentum 1, akkor egy listát kapunk vissza egy elemmel; ha 0, akkor egy üres listát kapunk vissza; ha az első argumentum több, mint a lista elemeinek száma, akkor hiba lép fel.
print(random.sample(l, 1))
# [3]
print(random.sample(l, 0))
# []
# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative
Ha az első argumentum egy tuple vagy egy string, akkor is egy listát kapunk vissza.
print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']
print(random.sample('abcde', 2))
# ['b', 'e']
Ha vissza akarsz térni egy tuple-hez vagy stringhez, használd a tuple(),join() parancsot.
print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')
print(''.join(random.sample('abcde', 2)))
# dc
Vegye figyelembe, hogy az értéket nem bírálja el, így ha az eredeti lista vagy tuple azonos értékű elemeket tartalmaz, fennáll a lehetősége, hogy ugyanaz az érték lesz kiválasztva.
l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
print(random.sample(l_dup, 3))
# [3, 1, 1]
Ha el akarod kerülni a duplikált értékeket, akkor a set() segítségével átalakíthatod halmazzá (set típusú), és csak az egyedi elemeket vonhatod ki, majd használhatod a sample() funkciót.
print(set(l_dup))
# {0, 1, 2, 3}
print(random.sample(set(l_dup), 3))
# [1, 3, 2]
Több elem véletlenszerű kiválasztása (duplikátumokkal): random.choices()
A random modul choices() függvénye lehetővé teszi több elem véletlenszerű kiválasztását egy listából, és a sample() függvénytől eltérően lehetővé teszi a duplikált elemek kiválasztását.
A choices() egy, a Python 3.6-ban bevezetett függvény. A korábbi verziókban nem érhető el.
A k argumentum a lekérdezendő elemek számát adja meg. A duplikáció megengedett, így a kinyerendő elemek száma nagyobb lehet, mint az eredeti lista elemeinek száma.
Mivel a k csak kulcsszavas argumentum, meg kell adni egy kulcsszót, például 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]
A k alapértelmezett értéke 1; ha kihagyjuk, akkor egy 1 elemű listát kapunk vissza.
print(random.choices(l))
# [1]
A weights argumentummal megadható az egyes elemek kiválasztásának súlya (valószínűsége), a lista elemeinek típusa pedig int vagy float lehet.
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]
A cum_weights argumentum megadható kumulatív súlyként is. A következő példakódban szereplő cum_weights egyenértékű a fenti első súlyokkal.
print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]
Mind a weights, mind a cum_weights argumentumok alapértelmezett értéke None, ami azt jelenti, hogy minden elem azonos valószínűséggel kerül kiválasztásra.
Ha az argumentum weights vagy cum_weights hossza (elemeinek száma) eltér az eredeti listától, hiba lép fel.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_
Hiba a súlyok és a cum_weights egyidejű megadása is.
# 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
Az eddigi példakódban példaként egy listát adtunk meg első argumentumként, de ugyanez vonatkozik a tuplikra és a stringekre is.
A véletlen számok magjának rögzítése
A random modul seed() függvényének egy tetszőleges egész szám megadásával rögzíthető a véletlenszám-vetőmag és inicializálható a véletlenszám-generátor.
Az azonos maggal történő inicializálás után az elemek kiválasztása mindig azonos módon történik.
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3