如何生成随机数列表,以使它们的总和等于随机选择的数

问题描述 投票:1回答:3

我想生成一个数字随机分布的列表,因此它们的总和将等于随机选择的数字。例如,如果随机选择的数字为5,则分布将为[1 2 2]或[2 3]或[1 1 1 2],依此类推。欢迎任何建议!

python list random distribution
3个回答
4
投票

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]

3
投票

循环中,您可以不断绘制一个介于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
投票

请先考虑连续进行。有一会儿,我们不在乎最终数,因此让我们在间隔[0 ... 1]中均匀采样X_i,以便它们的总和等于1

X_1 + X_2 + ... X_n = 1
© www.soinside.com 2019 - 2024. All rights reserved.