如何删除无尽生成器的重复项?

How can i remove duplicates for a endless generator?

如果我有一个随机样本生成器,它从一个大的space(无法枚举)中采样。

def random_generator(n=3):
  ####  .....  ####
  yield random.choice(large_space)  ## here i just use a simple random, but in real, i use many method to get the random

如果大的space能枚举出来,题就容易了

但是对于这么大的space,由于某些原因无法枚举(它是递归生成的,这使得有效样本太大,如果我调用这个space的生成器, next() 会淹没我的记忆,如果你想知道这个奇数生成器的细节,请看这个:How can i make a generator yield fast?)

基于此,有什么方法可以让我的random_generator永远不会产生重复样本吗?(有效性很重要)

如果您希望避免生成重复的随机数并希望通过不存储先前生成的随机数来保存 space。您可以使用布隆过滤器。

from bloom_filter import BloomFilter

bloom = BloomFilter(max_elements=n, error_rate=0.1)
large_space = list(range(1000000)) # Some large number

def random_generator(n):
    for _ in range(n):
        new_number = random.choice(large_space)
        while new_number not in bloom:
            new_number = random.choice(large_space)
        bloom.add(new_number)
        yield new_number