如何制作一个总和为 1 的随机列表,每个元素的最小和最大限制?

xiaoxingxing python 181

原文标题How to make a random list with a sum of 1 with minimum and maximum limits for each element?

我目前正在使用 python 进行一个多空投资组合优化项目。

问题是我必须生成一个总和为 1 的列表,并且列表的每个元素都应该大于或等于 -1 并且小于等于 5。

列表的长度也必须为 5。

有没有办法可以列出这样的清单?

原文链接:https://stackoverflow.com//questions/71476762/how-to-make-a-random-list-with-a-sum-of-1-with-minimum-and-maximum-limits-for-ea

回复

我来回复
  • BrokenBenchmark的头像
    BrokenBenchmark 评论

    您可以使用基于拒绝抽样的方法。生成一个包含五个元素的列表,如果它们的总和不是一个,则重复生成一个新列表,直到找到一个总和为 1 的列表:

    import random
    result = [random.randint(-1, 5) for _ in range(5)]
    while sum(result) != 1:
        result = [random.randint(-1, 5) for _ in range(5)]
    
    2年前 0条评论
  • donkopotamus的头像
    donkopotamus 评论

    由于权重总和必须为1的约束,这里只有四个随机源。因此,为前四个资产生成潜在权重:

    weights = [random.uniform(-1, 5) for i in range(4)]
    

    然后推断最终重量final_weight = 1 - sum(weights)是否满足要求。所以像:

    def generate_weights():
        while True:
            weights = [random.uniform(-1, 5) for i in range(4)]
            weights.append(1 - sum(weights))
            if -1 <= weights[-1] <= 5:
                return weights
            
    
    2年前 0条评论