实际上,最简单的解决方案是采用N个随机值并除以和。
一种更通用的解决方案是使用Dirichlet发行版
http://en.wikipedia.org/wiki/Dirichlet_distribution
(可在numpy中获得)。
通过更改分布的参数,您可以更改单个数字的“随机性”
>>> import numpy as np, numpy.random>>> print np.random.dirichlet(np.ones(10),size=1)[[ 0.01779975 0.14165316 0.01029262 0.168136 0.03061161 0.09046587 0.19987289 0.13398581 0.03119906 0.17598322]]>>> print np.random.dirichlet(np.ones(10)/1000.,size=1)[[ 2.63435230e-115 4.31961290e-209 1.41369771e-212 1.42417285e-188 0.00000000e+000 5.79841280e-143 0.00000000e+000 9.85329725e-005 9.99901467e-001 8.37460207e-246]]>>> print np.random.dirichlet(np.ones(10)*1000.,size=1)[[ 0.09967689 0.10151585 0.10077575 0.09875282 0.09935606 0.10093678 0.09517132 0.09891358 0.10206595 0.10283501]]
根据主要参数,狄利克雷分布将给出所有值都接近1./N的向量,其中N是向量的长度,或者给出向量中大多数值将为〜0的向量将是单个1,或者在这些可能性之间给出一些值。
编辑(原始答案的5年后):关于Dirichlet分布的另一个有用的事实是,如果您生成Gamma分布的一组随机变量,然后将它们除以它们的总和,就自然可以得到它。



