生成不重复的随机顶点

时间:2014-04-25 04:29:18

标签: python python-2.7 graph

我有以下代码生成随机数的元组,以便创建连接的非直接加权图。

for i in xrange(0,10):
     for j in xrange(0, (int)(10*random.random())):
          b = (int)(10*random.random())
          j = [(i,b)]
          print(j)

当我运行此代码时,我能够随机生成随机顶点(x,y),但是我遇到了一个问题,因为我的b变量有可能重复两次。例如,我可能会得到(6,3),然后是(6,3),当我添加权重时会破坏我正在尝试创建的图形。此外,我有时遇到问题,我可能会得到(2,4)然后得到(4,2),这再次破坏了我正在尝试创建的图形。

有谁知道如何防止顶点重复?

1 个答案:

答案 0 :(得分:2)

使用random.sample

>>> lst1 = random.sample(range(20), 10)
>>> lst2 = random.sample(range(20), 10)
>>> zip(lst1, lst2)
[(19, 5), (5, 11), (9, 19), (0, 9), (4, 6), (12, 0), (7, 12), (16, 1), (10, 7), (15, 16)]

您可以更改list生成的range(20)以适合您的顶点集。

不要在for循环内生成新的顶点,因为它可能会再次生成相同的顶点。 (不要随意从random.sample列表中选择)只需生成一次并zip将它们组合在一起。

由于您要删除(x, y)(y, x)类型的重复项。您可以执行以下操作。 (或简单的in方法也有效)

>>> r = [(19, 5), (5, 11), (5, 19)]
>>> from itertools import groupby
>>> m = map(set, r)
>>> m
[set([19, 5]), set([11, 5]), set([19, 5])]
>>> sorted(m, key=lambda x: sum(x))
[set([11, 5]), set([19, 5]), set([19, 5])]
>>> [tuple(k) for k, v in groupby(sorted(m, key = lambda x: sum(x)))]
[(11, 5), (19, 5)]