Python Numpy数组项顺序-序列的相等分布

Python Numpy数组项顺序-序列的相等分布,python,algorithm,numpy,random,graph-theory,Python,Algorithm,Numpy,Random,Graph Theory,假设我有一个洗牌numpy数组: a = np.array([1,2,3,4,5,6]*6) np.random.shuffle(a) 我如何确保洗牌数组中的每个项目跟随其他项目的次数相等 例如,我想确保数组中数字1跟在数字2后面的次数与它跟在数字4后面的次数相同。所有其他数字也是如此 对于这个问题,我们可以假设列表是循环的,即第一项紧跟在最后一项之后 通常我会发布一些我尝试过的代码,但当涉及到这一点时,我不知所措 我能想到的最低效的方法是编写一个函数,计算一个数字跟在另一个数字后面的次数,然

假设我有一个洗牌numpy数组:

a = np.array([1,2,3,4,5,6]*6)
np.random.shuffle(a)
我如何确保洗牌数组中的每个项目跟随其他项目的次数相等

例如,我想确保数组中数字1跟在数字2后面的次数与它跟在数字4后面的次数相同。所有其他数字也是如此

对于这个问题,我们可以假设列表是循环的,即第一项紧跟在最后一项之后

通常我会发布一些我尝试过的代码,但当涉及到这一点时,我不知所措

我能想到的最低效的方法是编写一个函数,计算一个数字跟在另一个数字后面的次数,然后检查所有计数是否相等。如果没有,则进行改组


但这并不能保证我最终会得到一个符合平等分布标准的列表。

以下是我能想到的最好的列表。请注意,对于36个数字,每个数字必须紧跟在另一个数字后面一次

while True:
    x = {i: set(range(1,7)) for i in range(1,7)}

    a = [random.choice(range(1,7))]  # start with a random number
    last = a[-1]
    while x[last]:
        next = random.choice(list(x[last]))
        x[last].remove(next)
        a.append(next)
        last = next

    if len(a) == 37:
        # We get to length 37 if and only if each set above is exhausted.
        # In this case, the first item will always equal the last item
        # (proof left as an exercise for the reader), so remove it.
        a = a[:-1]
        break

print(''.join(str(i) for i in a))

对我来说,产生的
22116425231355145433465615366263241
似乎满足标准。

你想要的在数学上是不可能的。您有36个数字,只有35个“followers”。是否有允许此操作的最小数组长度?还是我们总是少1?第一个数字后面什么都没有,所以根据下面的定义,你是少1。如果你认为你的列表是循环的,那么它是可能的。有意义的,我可以为这个问题的循环假设使用排列算子来生成所有36种可能性。你需要它们仍然以随机顺序排列吗?如果是这样,那么您必须编写“shuffle”函数;这不是一个内置的功能。