我正在寻找一个高效的Python函数,它可以在k
个容器中随机分配一个整数.
例如,allocate(3, 2)
将以相同的概率产生[3, 0]
、[2, 1]
、[1, 2]
或[0, 3]
(与Allocate an integer randomly across k bins不同,分配,而不是项目,应该均匀分布).
我正在寻找一个高效的Python函数,它可以在k
个容器中随机分配一个整数.
例如,allocate(3, 2)
将以相同的概率产生[3, 0]
、[2, 1]
、[1, 2]
或[0, 3]
(与Allocate an integer randomly across k bins不同,分配,而不是项目,应该均匀分布).
使用"星条旗"方法,我们可以将其转化为一个问题,即从n+k-1个可能的位置列表中为可能的分隔符 Select 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)在每个可能的分配中, Select n-k+1的分配可能是每个分配中的一个.
(请注意,与 comments existing answer to a similar question中的建议有细微的区别:这个问题要求的是非负整数的有序序列,而建议的答案给出的是正整数的有序序列.通过替换而不是不替换来 Select 点的天真修改允许全套非负整数分布,但不会留下每个分布.)同样有可能.考虑分配(4,3):获得[0, 0, 4 ]的唯一方法是滚动(0, 0),但您可以通过滚动(1, 3)或(3, 1)获得[1, 2, 1 ].