假设我有一个range(1, n + 1)
。我想要得到m
个唯一的对。
我发现,如果需要的对数接近于n(n-1)/2
(最大可能的对数),那么不能简单地每次生成随机对,因为它们会开始互相覆盖。我正在寻找一种比较懒惰的解决方案,在Python世界中非常高效。
我目前的尝试:
def get_input(n, m):
res = str(n) + "\n" + str(m) + "\n"
buffet = range(1, n + 1)
points = set()
while len(points) < m:
x, y = random.sample(buffet, 2)
points.add((x, y)) if x > y else points.add((y, x)) # meeh
for (x, y) in points:
res += "%d %d\n" % (x, y);
return res
(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2), (4, 0), (4, 1), (4, 2), (4, 3)
开始(如果它不依赖于n
,这就是你需要的枚举类型),注意到以 1 开头的有 1 个,以 2 开头的有 2 个,以此类推。为了从i
中得到这对数,我需要知道i
在哪个“块”中。例如,i = 7
在 4 块中 因为1+2+3 <= 7 < 1+2+3+4
,这相当于3(3-1)/2 <= 7 < 4(4-1)/2
。如果你解方程7 = k(k-1)/2
并转换成整数,你就能得到k
。再进行一些代数运算,你就能得到另一个索引。 - John Coleman