生成一个随机数列表,总计为1 [英] Generating a list of random numbers, summing to 1
问题描述
我如何列出N个(例如100个)随机数,使它们的和为1?
How would I make a list of N (say 100) random numbers, so that their sum is 1?
我可以列出一个随机数
r = [ran.random() for i in range(1,100)]
我将如何对其进行修改,以使列表的总和为1(这是用于概率模拟).
How would I modify this so that the list sums to 1 (this is for a probability simulation).
推荐答案
最简单的解决方案的确是采用N个随机值并除以和.
The simplest solution is indeed to take N random values and divide by the sum.
更通用的解决方案是使用Dirichlet分布 http://en.wikipedia.org/wiki/Dirichlet_distribution 在numpy中可用.
A more generic solution is to use the Dirichlet distribution http://en.wikipedia.org/wiki/Dirichlet_distribution which is available in numpy.
通过更改分布参数,您可以更改单个数字的随机性"
By changing the parameters of the distribution you can change the "randomness" of individual numbers
>>> 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的矢量,并且只有一个,或者在这些可能性之间提供一些东西.
Depending on the main parameter the Dirichlet distribution will either give vectors where all the values are close to 1./N where N is the length of the vector, or give vectors where most of the values of the vectors will be ~0 , and there will be a single 1, or give something in between those possibilities.
EDIT(原始答案的5年后):关于Dirichlet分布的另一个有用事实是,如果您生成Gamma分布的一组随机变量,然后将它们除以它们的总和,就自然可以得到它.
EDIT(5 years after the original answer): Another useful fact about the Dirichlet distribution is that you naturally get it, if you generate a Gamma-distributed set of random variables and then divide them by their sum.
这篇关于生成一个随机数列表,总计为1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!