使用“星条旗”方法,我们可以将其转化为一个问题,即从n+k-1个可能的位置列表中为可能的分隔符选择k-1个位置。(
Wikipedia proof
)
from random import sample
def allocate(n,k):
dividers = sample(range(1, n+k), k-1)
dividers = sorted(dividers)
dividers.insert(0, 0)
dividers.append(n+k)
return [dividers[i+1]-dividers[i]-1 for i in range(k)]
print(allocate(4,3))
n-k+1)在每个可能的分配中,选择n-k+1的分配可能是每个分配中的一个。
(注意评论中提出的建议的细微差别。)
existing answer to a similar question
:这个问题要求的是非负整数的有序序列,而建议的答案给出的是正整数的有序序列。通过替换而不是不替换来选择点的天真修改确实允许全套非负整数分布,但它不会使每个分布的可能性相等。考虑分配(4,3):获得[0, 0, 4 ]的唯一方法是滚动(0, 0),但您可以通过滚动(1, 3)或(3, 1)获得[1, 2, 1 ]。