Легко (если k <= n).Это похоже на получение списка из k чисел <n.Это будет список позиций номеров, чтобы получить.Создайте список диапазона (0..n), получите из него k случайных чисел.Вам не придется читать фактический список предметов до последнего момента.Очевидно, это полезно только в том случае, если окончательный список элементов медленно читается (он читается с диска или что-то в этом роде). </p>
Чтобы получить позиции для выбора предметов, просто выполните:
import random
itemstopick = random.Random().sample(range(0,n), k)
Если n, количество элементов неизвестно, то вы должны начать с выбора первых k элементов (это решение, если k = n).Тогда единственный выбор, который у вас есть, - это продолжить чтение элементов и либо оставить только прочитанный новый элемент (и удалить другой элемент), либо оставить текущие элементы такими, как они есть.Чтобы придерживаться одинаковой вероятности, вам придется уменьшать вероятность выбора последнего прочитанного элемента по мере продвижения.Вероятность сохранить последний элемент всегда должна быть P (k / n0), где n0 является значением n в то время.Я не верю, что вы можете сделать это лучше.
Если вы знаете какой-то минорант n (значение, которое вы можете гарантировать, n больше), просто смешайте два метода выше.Начните со списка, созданного с помощью minorant вместо n, затем продолжите как для неизвестного n.