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

后端 未结 9 2269
陌清茗
陌清茗 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 13:10

    Here's a solution using NumPy

    def generate_pairs(xs, ys):
        n = len(xs)
        m = len(ys)
        indices = np.arange(n)
    
        array = np.tile(ys, (n, 1))
        [np.random.shuffle(array[i]) for i in range(n)]
    
        counts = np.full_like(xs, m)
        i = -1
    
        for _ in range(n * m):
            weights = np.array(counts, dtype=float)
            if i != -1:
                weights[i] = 0
            weights /= np.sum(weights)
    
            i = np.random.choice(indices, p=weights)
            counts[i] -= 1
            pair = xs[i], array[i, counts[i]]
            yield pair
    

    Here's a Jupyter notebook that explains how it works

    Inside the loop, we have to copy the weights, add them up, and choose a random index using the weights. These are all linear in n. So the overall complexity to generate all pairs is O(n^2 m)

    But the runtime is deterministic and overhead is low. And I'm fairly sure it generates all legal sequences with equal probability.

提交回复
热议问题