Станом на 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. Якщо ви це зробите, це швидше на порядок.