如何生成总和为1的三个变量的所有可能组合

时间:2020-01-11 21:49:53

标签: python

我需要求解方程x + y + z = 1。

我需要生成x,y,z的所有可能组合,以便等式正确

我希望x,y,z的值在0.1到0.9之间,且跳跃值为0.1。

所以这些值限制为[0.1,0.2,...,0.8,0.9]

我找到了这个答案Finding all combinations of multiple variables summing to 1

但是它适用于R而不是python。

如果有人能启发我,那将非常有帮助。

3 个答案:

答案 0 :(得分:2)

您可以考虑生成所有三胞胎,而不是嵌套的三重循环

triplets = [(x/10.0, y/10.0, (10-x-y)/10.0) for x in range(1,9) for y in range(1,10-x)]

其中每个三元组(a,b,c)表示要分配给x, yz的可能值。

请注意,我在构建三元组时要乘以10,然后除以避免在直接执行操作时可能出现的舍入错误:

if x/10 + y/10 + z/10 == 1:

答案 1 :(得分:0)

最原始的解决方案是在所有组合上进行嵌套循环:

def variable_combinations(sum_up_to=1):
    for x in range(1, 10):
        for y in range(1, 10):
            for z in range(1, 10):
                if x/10 + y/10 + z/10 == sum_up_to:
                    yield (x/10, y/10, z/10)

all_solutions = list(variable_combinations())

答案 2 :(得分:0)

直接在python中避免嵌套循环:

import itertools
import numpy as np
x = y = z = [ i/10 for i in range(1,10)]

p = itertools.product(x,y,z)
combs = [e for e in p if np.sum(e) == 1]

现在combs是一个总计为1的三元组(元组)列表。