Create a random order of (x, y) pairs, without repeating/subsequent x's

后端 未结 9 2257
陌清茗
陌清茗 2021-02-08 12:25

Say I have a list of valid X = [1, 2, 3, 4, 5] and a list of valid Y = [1, 2, 3, 4, 5].

I need to generate all combinations of every element in

9条回答
  •  孤城傲影
    2021-02-08 12:52

    A simple solution to ensure an average O(N*M) complexity:

    def pseudorandom(M,N):
        l=[(x+1,y+1) for x in range(N) for y in range(M)]
        random.shuffle(l)
        for i in range(M*N-1):
                for j in range (i+1,M*N): # find a compatible ...
                    if l[i][0] != l[j][0]:
                        l[i+1],l[j] = l[j],l[i+1]
                        break  
                else:   # or insert otherwise.
                    while True:
                        l[i],l[i-1] = l[i-1],l[i]
                        i-=1
                        if l[i][0] != l[i-1][0]: break  
        return l
    

    Some tests:

    In [354]: print(pseudorandom(5,5))
    [(2, 2), (3, 1), (5, 1), (1, 1), (3, 2), (1, 2), (3, 5), (1, 5), (5, 4),\
    (1, 3), (5, 2), (3, 4), (5, 3), (4, 5), (5, 5), (1, 4), (2, 5), (4, 4), (2, 4),\ 
    (4, 2), (2, 1), (4, 3), (2, 3), (4, 1), (3, 3)]
    
    In [355]: %timeit pseudorandom(100,100)
    10 loops, best of 3: 41.3 ms per loop
    

提交回复
热议问题