Numpy array item order - 序列的平均分布
Numpy array item order - equal distribution of sequences
假设我有一个随机排列的 numpy 数组:
a = np.array([1,2,3,4,5,6]*6)
np.random.shuffle(a)
如何确保打乱后的数组中的每一项都以相同的次数跟随其他项?
例如,我想确保数字 1 在数组中跟随数字 2 的次数与它跟随数字 4 的次数相同。对于所有其他数字也是如此
对于这个问题,我们可以假设列表是循环的,即第一项跟在最后一项之后
通常我会 post 一些我尝试过的代码,但是当涉及到这个时我不知所措。
我能想到的最低效的方法是编写一个函数来计算一个数字跟随另一个数字的次数,然后检查所有计数是否相等。如果没有,重新洗牌。
但这并不能保证我最终会得到一个符合平等分配标准的列表。
这是我能想到的最好的。请注意,对于 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))
对我来说,产生 221164425231355145433465615366263241
似乎满足标准。
假设我有一个随机排列的 numpy 数组:
a = np.array([1,2,3,4,5,6]*6)
np.random.shuffle(a)
如何确保打乱后的数组中的每一项都以相同的次数跟随其他项?
例如,我想确保数字 1 在数组中跟随数字 2 的次数与它跟随数字 4 的次数相同。对于所有其他数字也是如此
对于这个问题,我们可以假设列表是循环的,即第一项跟在最后一项之后
通常我会 post 一些我尝试过的代码,但是当涉及到这个时我不知所措。
我能想到的最低效的方法是编写一个函数来计算一个数字跟随另一个数字的次数,然后检查所有计数是否相等。如果没有,重新洗牌。
但这并不能保证我最终会得到一个符合平等分配标准的列表。
这是我能想到的最好的。请注意,对于 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))
对我来说,产生 221164425231355145433465615366263241
似乎满足标准。