Функцыі choice(), sample() і choices() у модулі random стандартнай бібліятэкі Python можна выкарыстоўваць для выпадковага выбару і атрымання элементаў са спісу, картэжа, радка або іншага аб’екта паслядоўнасці (выпадковая выбарка).
choice() атрымлівае адзін элемент, sample() і choices() атрымлівае спіс з некалькіх элементаў. sample() з’яўляецца неаднаўляльным здабываннем без дублікатаў, choices() з’яўляецца аднаўляльным здабываннем з дублікатамі.
Тут прадстаўлена наступная інфармацыя.
- Выберыце адзін элемент выпадковым чынам.:
random.choice()
- Выпадкова выбраць некалькі элементаў (без дублікатаў):
random.sample()
- Выпадкова выбраць некалькі элементаў (з дублікатамі):
random.choices()
- Выпраўце насенне выпадковых лікаў
Выберыце адзін элемент выпадковым чынам.:random.choice()
З дапамогай функцыі выпадковага модуля select() адзін элемент выпадковым чынам выбіраецца са спісу і можа быць атрыманы.
import random
l = [0, 1, 2, 3, 4]
print(random.choice(l))
# 1
Тое ж самае тычыцца картэжаў і радкоў. У выпадку радкоў выбіраецца адзін сімвал.
print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy
print(random.choice('abcde'))
# b
Памылка, калі ў якасці аргумента зададзены пусты спіс, картэж або радок.
# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence
Выпадкова выбраць некалькі элементаў (без дублікатаў):random.sample()
З дапамогай функцыі sample() модуля random вы можаце атрымаць некалькі элементаў у выпадковым парадку са спісу. Адсутнічае дубляванне элементаў (выманне, якое не падлягае аднаўленню).
Першы аргумент – гэта спіс, а другі – колькасць элементаў, якія трэба атрымаць. Спіс вяртаецца.
import random
l = [0, 1, 2, 3, 4]
print(random.sample(l, 3))
# [2, 4, 0]
print(type(random.sample(l, 3)))
# <class 'list'>
Калі другі аргумент усталяваны ў 1, то таксама вяртаецца спіс з адным элементам; калі ён усталяваны ў 0, спіс пусты. Калі другі аргумент роўны 1, вяртаецца спіс з адным элементам; калі ён роўны 0, вяртаецца пусты спіс; калі першы аргумент больш, чым колькасць элементаў у спісе, адбываецца памылка.
print(random.sample(l, 1))
# [3]
print(random.sample(l, 0))
# []
# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative
Калі першым аргументам з’яўляецца картэж або радок, вяртаецца ўсё роўна спіс.
print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']
print(random.sample('abcde', 2))
# ['b', 'e']
Калі вы хочаце вярнуцца да кортэжа або радка, выкарыстоўвайце tuple(),join().
print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')
print(''.join(random.sample('abcde', 2)))
# dc
Звярніце ўвагу, што значэнне не ацэньваецца, таму, калі зыходны спіс або картэж змяшчае элементы з аднолькавым значэннем, ёсць верагоднасць, што будзе выбрана тое ж значэнне.
l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
print(random.sample(l_dup, 3))
# [3, 1, 1]
Калі вы хочаце пазбегнуць дубліравання значэнняў, вы можаце выкарыстоўваць set() для пераўтварэння яго ў набор (тып набору) і здабываць толькі унікальныя элементы, а затым выкарыстоўваць sample().
print(set(l_dup))
# {0, 1, 2, 3}
print(random.sample(set(l_dup), 3))
# [1, 3, 2]
Выпадкова выбраць некалькі элементаў (з дублікатамі):random.choices()
Функцыя выпадковага модуля choices() дазваляе здабываць некалькі элементаў у выпадковым парадку са спісу, і ў адрозненне ад sample(), яна дазваляе выбіраць паўтаральныя элементы.
choices() – гэта функцыя, дададзеная ў Python 3.6. Ён недаступны ў больш ранніх версіях.
Аргумент k вызначае колькасць элементаў, якія трэба атрымаць. Дапускаецца дубляванне, таму колькасць элементаў, якія трэба атрымаць, можа быць больш, чым колькасць элементаў у зыходным спісе.
Паколькі k з’яўляецца аргументам толькі з ключавым словам, неабходна паказаць ключавое слова, напрыклад 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]
Значэнне k па змаўчанні роўна 1; калі ён апушчаны, вяртаецца спіс з 1 элементам.
print(random.choices(l))
# [1]
Вагавыя вагі аргументаў могуць быць выкарыстаны для ўказання вагі (імавернасці), што кожны элемент будзе абраны, а тып элементаў у спісе можа быць int або 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]
Аргумент cum_weights таксама можа быць зададзены як сукупны вага. cum_weights у наступным узоры кода эквівалентны першым вагам вышэй.
print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]
Па змаўчанні для абодвух аргументаў вагаў і cum_weights з’яўляецца None, што азначае, што кожны элемент выбіраецца з аднолькавай верагоднасцю.
Калі даўжыня (колькасць элементаў) аргументаў вагаў або cum_weights адрозніваецца ад першапачатковага спісу, узнікае памылка.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_
Таксама памылкова ўказваць вагі і cum_weights адначасова.
# 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
Да гэтага часу мы паказалі спіс у якасці першага аргумента ў якасці прыкладу ў прыкладзе кода, але тое ж самае ставіцца да картэжаў і радкоў.
Выпраўце насенне выпадковых лікаў
Даючы адвольнае цэлае лік у функцыю seed() выпадковага модуля), можна зафіксаваць выпадковы лік, а генератар выпадковых лікаў можна ініцыялізаваць.
Пасля ініцыялізацыі адным і тым жа насенным элементам элементы заўсёды выбіраюцца аднолькава.
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3