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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在范围内分配越来越多的数字并确保它们总和为N?相关的知识,希望对你有一定的参考价值。

说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
答案

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

如果你想要一个包含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是不可能的。

另一答案

你的问题是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

以上是关于如何在范围内分配越来越多的数字并确保它们总和为N?的主要内容,如果未能解决你的问题,请参考以下文章

Java:检查数字的每个数字是否在一个范围内

选择 n 个总和固定的数字

如何创建一个变量,该变量是给定时间范围内连续行的总和并按 id

数组中的两个不同数字,它们的和等于给定值

如何在整数数组中查找所有有序元素对,其总和位于给定的值范围内

计数子阵列的总和在[L,R]范围内