Повторно вызывая random.choice()
, вы фактически выбираете с заменой . Это означает, что вы можете выбирать один и тот же файл дважды, в отдельных обходах цикла.
Попробуйте random.sample()
вместо:
for to_copy in random.sample(files, int(len(files)*.1)):
shutil.copy(...)
Рассмотрим эту программу:
import random
seq = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
for _ in range(5):
i = random.choice(seq)
print(i, end=' ')
print()
for i in random.sample(seq, 5):
print(i, end=' ')
print()
Вот два запуска программы:
$ python x.py
g f e c b
c j b a d
$ python x.py
c e a a e
j f e a i
Обратите внимание, что в первой строке второго прогона random.choice()
случайно выбрал a
дважды и e
дважды. Если бы это были имена файлов, то было бы скопировано только 3 файла. Фактически выполняется пять копий, но избыточные копии не добавляют к количеству файлов. Конечно, количество повторяющихся идентичных выборов случайное, что приводит к противоречивому поведению, которое вы видите.
С другой стороны, вторая строка, полученная из random.sample()
, никогда не будет иметь повторяющихся элементов, поскольку random.sample()
выбирает без замены.