我正在尝试编写一个算法,从序列中随机选择N个不同的项目,而不事先知道序列的大小,并且在迭代超过一次的情况下成本昂贵。例如,序列的元素可能是一个巨大文件的行。
当N=1时(即,“从巨大序列中随机选择一个元素”),我已经找到了一个解决方案:
import random
items = range(1, 10) # Imagine this is a huge sequence of unknown length
count = 1
selected = None
for item in items:
if random.random() * count < 1:
selected = item
count += 1
但是我怎样才能对其他值的N(比如说,N=3)实现相同的事情呢?
random.sample(your_collection, N)
来获取N个随机元素。请注意不要改变原意。 - Mark Ameryrange(1, 10)
。这真的是一个 XY 问题,询问“如何确定/估计迭代器长度的上限(而不进行迭代)”吗?例如,如果它是一个文本文件,我们只需获取(/估计)文件大小,然后除以估计的平均/最大/最小行长度(以字符为单位)。 (对于 Unicode,估计字节中的字符长度) - smci__length_hint __()
。当我预先知道可迭代类的长度时,我能加速它吗?。而且,通常不需要将整个文件调用到内存中来估计其行长/记录长度/任何其他内容。那么,您正在处理什么类型的数据,我们如何高效地估计(上限)其长度? - smci