import random random.choices(population, weights=None, *, cum_weights=None, k=1)
population
- последовательность (строка, список и т.д.)weights=None
- последовательность с относительными весами,cum_weights=None
- последовательность с кумулятивными весами,k=1
- количество выбираемых случайных элементов.k
.Функция random.choices()
модуля random
возвращает список элементов длины k
, выбранных из последовательности population
с перестановкой элементов. Другими словами, функция используется, когда требуется выбрать несколько k
случайных элементов из заданной последовательности, элементы не сохраняют первоначальный порядок.
>>> import random >>> lst = [10, 25, 30, 45, 50 ,65, 70, 85, 90, 105] >>> random.choices(lst, k=5) # [90, 65, 90, 10, 45] >>> random.choices(lst, k=3) # [50, 90, 65]
k > len(population)
, то элементы population
могут повторятся несколько раз.population
не задан, то вызывает исключение IndexError
.set()
и frozenset()
не поддерживаются. Множество set()
/frozenset()
сначала должно быть преобразовано в список или кортеж.Если указана последовательность weights
, выбор производится в соответствии с относительными весами weights
. В качестве альтернативы, если задана последовательность cum_weights
, выбор производится в соответствии с кумулятивными весами, вычисленными с использованием itertools.accumulate()
. Например, относительные веса [10, 5, 30, 5]
эквивалентны совокупным весам [10, 15, 45, 50]
. Внутренне, относительные веса weights
преобразуются в кумулятивные веса cum_weights
, прежде чем делать выбор, поэтому предоставление кумулятивных весов экономит работу.
>>> import random >>> lst = [10, 25, 30, 45, 50 ,65, 70, 85, 90, 105] >>> weights = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> random.choices(lst, weights=weights, k=5) # [85, 90, 90, 10, 30] >>> random.choices(lst, cum_weights=weights, k=5) # [105, 50, 105, 70, 65]
weights
, ни cum_weights
не указаны, то выбор делается с равной вероятностью. population
. Если длина weights
или cum_weights
отличается от population
, то вызывается исключение TypeError
.Аргументы weights
или cum_weights
могут использовать любой числовой тип, который взаимодействует с вещественным значениями, возвращаемыми random.random()
, включающий целые числа, числа с плавающей запятой и дроби, но исключает десятичные дроби. Предполагается, что веса передаются неотрицательными. Вызывает ValueError
, если оба аргумента weights
и cum_weights
равны нулю.
Для заданного начального числа, функция random.choices()
с равным весом обычно производит последовательность, отличную от повторяющихся вызовов функции random.choice()
. Алгоритм, используемый random.choices()
, использует арифметику с плавающей запятой для внутренней согласованности и скорости. Алгоритм функции random.choice()
, по умолчанию использует целочисленную арифметику с повторяющимися выборками, чтобы избежать небольших отклонений от ошибки округления.
Изменено в Python 3.9: вызывает ValueError
, если оба аргумента weights
и cum_weights
равны нулю.
>>> import random # строка представляет собой неизменяемую # последовательность символов >>> line = 'abcdefg' # выбор случайного символа из строки `line` >>> random.choices(line) # ['a'] >>> random.choices(line, k=4) # ['d', 'c', 'a', 'b']