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

问题描述 投票:-2回答:2

说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
python numpy statistics
2个回答
2
投票

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

如果你想要一个包含k值的算术系列,它与步长Nr相加,你会得到

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而max = 4是不可能的。


0
投票

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

获得sumarithmetic list的等式是:

// The sum of the list
theSum = n*(minNum+maxNum)/2

我们现在可以解决n(我们需要的值包括minNummaxNum):

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)))

输出:

12.0
© www.soinside.com 2019 - 2024. All rights reserved.