我想生成一个数字随机分布的列表,因此它们的总和将等于随机选择的数字。例如,如果随机选择的数字为5,则分布将为[1 2 2]或[2 3]或[1 1 1 2],依此类推。欢迎任何建议!
让n
为您想要将值相加的数字。生成随机大小(小于sample
)的随机n
,该值由1至n
范围内的值组成,不包括n
。现在添加端点0和n
,然后排序。排序值的连续差值总和为n
。
import random as r
def random_sum_to(n):
a = r.sample(range(1, n), r.randint(1, n-1)) + [0, n]
list.sort(a)
return [a[i+1] - a[i] for i in range(len(a) - 1)]
print(random_sum_to(20)) # yields, e.g., [4, 1, 1, 2, 4, 2, 2, 4]
循环中,您可以不断绘制一个介于1和剩余和之间的随机数,直到达到总数为止>
from random import randint
def generate_values(n):
values = []
while n > 0:
value = randint(1, n)
values.append(value)
n -= value
return values
请先考虑连续进行。有一会儿,我们不在乎最终数,因此让我们在间隔[0 ... 1]中均匀采样X_i,以便它们的总和等于1
X_1 + X_2 + ... X_n = 1