Tam*_*más 16
您可能正在寻找的分布称为Dirichlet分布.Python中没有用于从Dirichlet分布中绘制随机数的内置函数,但NumPy包含一个:
>>> from numpy.random.mtrand import dirichlet
>>> print dirichlet([1] * n)
Run Code Online (Sandbox Code Playgroud)
这将给出n个总和为1的数字,并且每个这样的组合的概率将相等.
或者,如果你没有NumPy,你可以利用从n维Dirichlet分布中抽取的随机样本,可以通过从形状和比例参数等于1 的伽玛分布中绘制n个独立样本来生成这一事实.然后将样本除以总和:
>>> from random import gammavariate
>>> def dirichlet(n):
... samples = [gammavariate(1, 1) for _ in xrange(n)]
... sum_samples = sum(samples)
... return [x/sum_samples for x in samples]
Run Code Online (Sandbox Code Playgroud)
您需要Dirichlet分布的原因是因为如果您只是从某个区间均匀地绘制随机数,然后将它们除以它们的总和,则得到的分布将偏向于由大致相等的数字组成的样本.有关此主题的更多信息,请参阅Luc Devroye的书.