Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 求和为1的四个数的所有子集_Python_Permutation - Fatal编程技术网

Python 求和为1的四个数的所有子集

Python 求和为1的四个数的所有子集,python,permutation,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*“精度”,在这种情况下,k是介于0和20之间的整数 所以我试过了。如

在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*“精度”,在这种情况下,k是介于0和20之间的整数

所以我试过了。如果我只需按“精度”在每个For循环中执行4X For循环步进,并检查它是否为有效分配(即,它的总和是否为1.0),那么它将成功工作。这是可行的,但我希望找到一种更有效的方法。正如人们常说的,更像是蟒蛇

假设
r
(精度的倒数)是一个整数(否则就不可能解决问题),这个问题相当于找到与r之和的所有4个非负整数元组。这相当于从第一个r+3整数中选择3个数字,并在所选数字和端点之间取未闭合数字的运行长度。看

这样,在Python中使用
itertools.combines
的解决方案就很简单了

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

到目前为止,你考虑过哪些方法?@MikePelley见上图。我建议将值限制为整数。否则,您将使用浮点,并且由于不精确的表示,您将遇到许多问题。看起来和另一个数字相加的数字实际上会有一些小的偏差。如果我设置r=100,这基本上意味着我们可以将每个元素更改1%(0.01)的倍数,我得到这个无效的分配0.0 0.19 0.1 0.71。知道吗?为什么无效?也许我不明白这个问题,但看起来每个项目都是0.01的倍数,它们加起来等于1。我相信它们加起来等于1.01。例如,0.18 0.1 0.71是有效的。@bazzoli92看起来你用糟糕的数学玷污了一个好答案,甚至Unix dc说0.0.19 0.1 0.71++->1。00@bazzoli92你用眼睛检查下(1/100)位数是否正常,是否混淆了0.1和0.01?