随机化一台发电机

时间:2015-01-31 19:35:14

标签: python python-3.x random generator

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

有没有办法做到这一点(将其更改为list并且无法执行random.shuffle)?

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

itertools.combinations(a_large_set, 3)

2 个答案:

答案 0 :(得分:1)

  

有没有办法做到这一点

没有

答案 1 :(得分:1)

您无法在生成器中跳过。有一些方法可以迭代并创建有效的随机样本,但是您必须对要迭代的元素数量设置上限。然后,它不代表生成器可以生成的所有可能值的有效随机选择。

如果要从大型列表中生成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)