用于构造不相交随机列表的内存高效版本

Memory efficient version for the construction disjoint random lists

我们必须正整数 b,nb < n/2。我们想要生成两个随机的不相交列表 I1, I2,它们都包含来自 {0,1,...,n}.b 个元素,下面是一个简单的方法。

def disjoint_sets(bound,n):
    import random
    I1=[];I2=[];
    L = random.sample(range(0,n+1), n+1)
    I1 = L[0:bound]
    I2 = L[bound:2*bound]
    return I1,I2

对于大 b,n(比如 b=100, n>1e7),前一个内存效率不高。因为 L 很大。我想知道是否有一种方法可以在不使用 range(0,n+1) 的情况下获得 I1,I2?

这是一种碰碰运气的方法,适用于您提到的范围内的数字:

import random

def rand_sample(k,n):
    #picks k distinct random integers from range(n)
    #assumes that k is much smaller than n
    choices = set()
    sample = []
    for i in range(k): #xrange(k) in Python 2
        choice = random.randint(0,n-1)
        while choice in choices:
            choice = random.randint(0,n-1)
        choices.add(choice)
        sample.append(choice)
    return sample

对于你的问题,你可以这样做:

def rand_pair(b,n):
    sample = rand_sample(2*b,n)
    return sample[:b],sample[b:]