Сообщить об ошибке.

Функция random.choices() в Python, выбирает несколько случайных элементов

Выбирает случайным образом несколько элементов из списка, строки, кортежа

Синтаксис:

import random

random.choices(population, weights=None, *, cum_weights=None, k=1)

Параметры:

  • population - последовательность (строка, список и т.д.)
  • weights=None - последовательность с относительными весами,
  • cum_weights=None - последовательность с кумулятивными весами,
  • k=1 - количество выбираемых случайных элементов.

Возвращаемое значение:

Описание:

Функция 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']