非均匀分布随机数组

Jav*_*ier 4 python random

我需要在[0,1]之间生成随机浮点数的向量,使得它们的和等于1并且非均匀地分布.是否有任何python函数生成这样的向量?

最好的祝愿

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的书.