Станом на Python v3.6
, random.choices
може використовуватися для повернення list
елементів заданого розміру з даної сукупності з необов'язковими вагами.
random.choices(population, weights=None, *, cum_weights=None, k=1)
популяція : list
містить унікальні спостереження. (Якщо порожній, піднімається IndexError
)
ваги : Точніше відносні ваги, необхідні для вибору.
cum_weights : сукупні ваги, необхідні для вибору.
k : розмір ( len
) list
для виведення. (За замовчуванням len()=1
)
Трохи застережень:
1) Він використовує зважений відбір проб із заміною, щоб намальовані елементи були згодом замінені. Значення в послідовності зважування самі по собі не мають значення, але їх відносне співвідношення має значення.
На відміну від того, np.random.choice
який може сприймати лише ймовірності як ваги, а також які повинні забезпечувати підсумовування індивідуальних ймовірностей до 1 критерію, таких норм тут немає. Поки вони належать до числових типів ( int/float/fraction
крім Decimal
типу), вони все одно будуть виконуватись.
>>> import random
# weights being integers
>>> random.choices(["white", "green", "red"], [12, 12, 4], k=10)
['green', 'red', 'green', 'white', 'white', 'white', 'green', 'white', 'red', 'white']
# weights being floats
>>> random.choices(["white", "green", "red"], [.12, .12, .04], k=10)
['white', 'white', 'green', 'green', 'red', 'red', 'white', 'green', 'white', 'green']
# weights being fractions
>>> random.choices(["white", "green", "red"], [12/100, 12/100, 4/100], k=10)
['green', 'green', 'white', 'red', 'green', 'red', 'white', 'green', 'green', 'green']
2) Якщо ні ваги , ні cum_weights вказані, вибір зроблений з однаковою ймовірністю. Якщо подається послідовність ваг , вона повинна бути такої ж довжини, як і сукупність послідовність .
Визначення як ваги, так і ваги cum_weights піднімає a TypeError
.
>>> random.choices(["white", "green", "red"], k=10)
['white', 'white', 'green', 'red', 'red', 'red', 'white', 'white', 'white', 'green']
3) cum_weights , як правило, є результатом itertools.accumulate
функції, яка дуже зручна в таких ситуаціях.
З пов'язаної з документацією документації:
Внутрішні відносні ваги перетворюються на кумулятивні ваги перед тим, як робити вибір, тому подача кумулятивних ваг економить роботу.
Отже, або постачання, weights=[12, 12, 4]
або cum_weights=[12, 24, 28]
для нашого надуманого випадку дають однаковий результат, і останній здається більш швидким / ефективним.
random.choices
для окремих дзвінків. Якщо вам потрібно багато випадкових результатів, дуже важливо підбирати їх все відразу, коригуючиnumber_of_items_to_pick
. Якщо ви це зробите, це швидше на порядок.