Python Numpy数组项顺序-序列的相等分布
假设我有一个洗牌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后面的次数相同。所有其他数字也是如此 对于这个问题,我们可以假设列表是循环的,即第一项紧跟在最后一项之后 通常我会发布一些我尝试过的代码,但当涉及到这一点时,我不知所措 我能想到的最低效的方法是编写一个函数,计算一个数字跟在另一个数字后面的次数,然
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”函数;这不是一个内置的功能。