有效地从多个列表中随机选择

时间:2019-06-26 20:17:46

标签: python random

我正在实现Wilson算法,该算法使用沿图的随机游动。因此,在每一步中,我目前都在当前顶点的邻居列表上运行random.random.choice。但是,这显然很慢。如果我要重复从同一列表中进行随机选择,则可以使用numpy的np.random.choice较大的大小,但是由于邻居的长度对于所有顶点都不相同,因此我不确定如何执行此操作。 / p>

def wilsons(G):
    nodes = list(G.keys())
    v1 = random.choice(nodes)
    v2 = random.choice(nodes)
    V = [v1]
    v = v1
    while v != v2:
        v = random.choice(G[v])
        if v in V:
            V = V[0:V.index(v)]
        V.append(v)

    out = {}
    out[V[0]] = [V[1]] if len(V) > 1 else []
    out[V[-1]] = [V[-2]] if len(V) > 1 else []
    for i in range(1,len(V)-1):
        out[V[i]] = [V[i-1], V[i+1]]
    U = set(V)

    nnodes = len(nodes)
    outlen = len(V)
    while outlen < nnodes:
        v = random.choice(list(set(nodes)-U))
        V = [v]
        while v not in U:
            v = random.choice(G[v])
            if v in V:
                V = V[0:V.index(v)]
            V.append(v)
        U.update(set(V))
        outlen += len(V)-1

        out[V[0]] = [V[1]]

        out[V[-1]].append(V[-2])
        for i in range(1,len(V)-1):
            out[V[i]] = [V[i-1], V[i+1]]
    return out

0 个答案:

没有答案