查找总和为1

时间:2016-05-27 04:15:17

标签: python permutation

我正在尝试计算四个有理数的所有子集(“分配”),它们在python中总和为1.0。 例如,有效分配将是[0.2,0.2,0.4,0.2]或[1.0,0,0,0]或[0.35,0.35,0.3,0]。重复很重要。我的意思是,例如[0.2,0.2,0.4,0.2]和[0.4,0.2,0.2,0.2]都是有效的分配。

显然会有非常多的子集,所以为了使这个更小,我想指定一个“精度”。例如,精度为0.05将允许子集中的每个元素改变k *“precision”,其中k是0到20之间的整数。

所以我试过了。如果我只是通过“precision”在每个for循环中执行4X For循环步进并检查它是否是有效分配(即它是否总和为1.0),它就能成功运行。这有效,但我希望找到一种更有效的方法。正如人们喜欢说的,更多的是pythonic。

1 个答案:

答案 0 :(得分:2)

假设r(精度的倒数)是一个整数(否则无法解决),问题相当于找到总和为r的所有4元非负整数。这相当于从第一个r + 3个整数中选择3个数字,并在所选择的和结束之间取出未选择的数字的运行长度。见https://en.wikipedia.org/wiki/Stars_and_bars_(combinatorics)

有了这个,使用itertools.combinations在Python中解决方案很简单。

from __future__ import division
import itertools

r = 20

for x in itertools.combinations(range(r + 3), 3):
    print x[0]/r, (x[1]-x[0]-1)/r, (x[2]-x[1]-1)/r, (r+2-x[2])/r