Принципиальное отличие состоит в том, что random.choices()
будет (в конечном итоге) рисовать элементы в одной и той же позиции (всегда выборка из всей последовательности, поэтому после рисования элементы заменяются - с заменой ), в то время как random.sample()
не будет (после отбора элементов они удаляются из популяции в выборку, поэтому после извлечения элементы не заменяются - без замены ).
Обратите внимание, что здесь заменено следует понимать как , помещенное назад , а не как синоним замещенное .
Чтобы лучше понять это, давайте рассмотрим следующий пример:
import random
random.seed(0)
ll = list(range(10))
print(random.sample(ll, 10))
# [6, 9, 0, 2, 4, 3, 5, 1, 8, 7]
print(random.choices(ll, k=10))
# [5, 9, 5, 2, 7, 6, 2, 9, 9, 8]
Как видите, random.sample()
не создает повторяющихся элементов, в то время как random.choices()
делает.
В вашем примере оба метода имеют повторяющиеся значения, поскольку у вас есть повторяющиеся значения в исходной последовательности, но в случае random.sample()
эти повторяющиеся значения должны исходить из разных позиций исходного ввода.
Eventua только вы не можете sample()
больше, чем размер входной последовательности, в то время как это не проблема с choices()
:
# print(random.sample(ll, 20))
# ValueError: Sample larger than population or is negative
print(random.choices(ll, k=20))
# [9, 3, 7, 8, 6, 4, 1, 4, 6, 9, 9, 4, 8, 2, 8, 5, 0, 7, 3, 8]
Более общее c и теоретическое обсуждение процесса выборки может можно найти в Википедии .