如何在范围内分配越来越多的数字并确保它们总和为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
值的算术系列,它与步长N
的r
相加,你会得到
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
和最小/最大值,我们可以计算从minValue
到maxValue
需要多少sum
。
获得sum
的arithmetic list
的等式是:
// The sum of the list
theSum = n*(minNum+maxNum)/2
我们现在可以解决n
(我们需要的值包括minNum
和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)))
输出:
12.0
以上是关于如何在范围内分配越来越多的数字并确保它们总和为N?的主要内容,如果未能解决你的问题,请参考以下文章
如何创建一个变量,该变量是给定时间范围内连续行的总和并按 id