如何在范围内分配越来越多的数字并确保它们总和为N?

时间:2017-12-23 01:10:13

标签: python numpy statistics

说N = 150,我有步数= 100。

我想要一个能够为数组生成100(或任何数字)条目的函数,这些函数以某种速率增加,我可以设置它们并且它们总和为N.理想情况下,我会设置最小值和最大值。

Examples: min=1, max=4

distributed_array = [1, 1.1, 1.2, 1.3 ...  3.9, 4]

np.sum(distributed_array) = 150

2 个答案:

答案 0 :(得分:2)

您的陈述过度约束了问题,因此通常无法获得有效答案。

如果您想要一个包含k总和为N并且步长为r的{​​{1}}值的算术系列,那么

sum(x, x + r, x + 2*r, ... x + (k - 1) * r)

  == k * (2 * x + (k - 1) * r) / 2       # by Gauss

  == N     # by the problem definition

你可以重新排列以找到

min == x == N / k - (k - 1) * r / 2

max == x + (k - 1) * r == N / k + (k - 1) * r / 2

考虑到这一点,应该清楚任何这样的系列的中位数必须是N / k - 所以,使用你的N = 150和k = 100的例子,中位数必须是1.5 - 所以min = 1并且最大= 4是不可能的。

答案 1 :(得分:0)

您的问题是arithmetic list(数学),这意味着如果我们知道{steps,我们可以计算从minValuemaxValue需要多少sum列表中的1}}和事先的最小/最大值。

获取sum的{​​{1}}的等式是:

arithmetic list

我们现在可以解决// The sum of the list theSum = n*(minNum+maxNum)/2 (我们需要包含nminNum所需的值的数量):

maxNum

该计划:

n = theSum*2/(minNum + maxNum)

输出:

theSum = 12.0
minNum = 1.0
maxNum = 5.0
n = int(theSum*2/(minNum + maxNum))

print(np.linspace(minNum, maxNum, num=n))

并确认总和:

[ 1.          2.33333333  3.66666667  5.        ]

输出:

print(sum(np.linspace(minNum, maxNum, num=n)))