随机生成器

Randomize a generator

我想检查 属性 的极长(超过十亿个元素)生成器的元素。显然,检查所有元素是不可行的(大约需要 400 年)。目前,它们以有序的方式生产。为了让我有时间检查的小样本更能代表整个事情,我想随机访问生成器。

有什么方法可以做到这一点(因为将其更改为 list 并且无法执行 random.shuffle)?

我正在尝试从大型输入集的 itertools.combinations 结果中选择一个随机样本:

itertools.combinations(a_large_set, 3)

Is there any way to do this

没有

您不能在生成器中向前跳转。有多种方法可以迭代和创建有效的随机样本,但您必须对要迭代的元素数量设置上限。那么它就不会代表生成器可以产生的所有可能值中的有效随机选择。

如果您要从一个大列表中生成 3 个元素的组合,则只需选择 3 个样本:

def random_combinations_sample(lst, element_count, sample_size):
    result = set()
    while len(result) < sample_size:
        indices = random.sample(xrange(len(lst)), element_count)
        sample = tuple(lst[i] for i in sorted(indices))
        result.add(sample)
    return list(result)

如果您只需要一组随机组合,则无需生成所有可能的 组合。与 itertools.combinations() 一样,元素是按照它们在输入列表中出现的顺序选取的。

而不是:

random.sample(itertools.combinations(a_large_set, 3), 10)

你会用

random_combinations_sample(a_large_set, 3, 10)