Javascript 如何返回值数组,其和等于指定的数字

Javascript 如何返回值数组,其和等于指定的数字,javascript,arrays,distributed,curve,Javascript,Arrays,Distributed,Curve,我试图创建一个集合长度的数字数组,定义集合中的最小值和最大值,并让一个函数确定集合中其余的数字。更重要的是,这个数字数组的和必须等于一个预定值。诀窍在于弄清楚这个函数是如何工作的 我找到了,它为我提供了以下功能: export const distributeValues = (amount, weights=[]) => { const distributedAmounts = [] let totalWeights = weights.reduce( (a,b) =&g

我试图创建一个集合长度的数字数组,定义集合中的最小值和最大值,并让一个函数确定集合中其余的数字。更重要的是,这个数字数组的和必须等于一个预定值。诀窍在于弄清楚这个函数是如何工作的

我找到了,它为我提供了以下功能:

export const distributeValues = (amount, weights=[]) => {
    const distributedAmounts = []
    let totalWeights = weights.reduce( (a,b) => a + b)

    weights.forEach( weight => {
        const weightValue = parseFloat(weight)
        const percentage = weightValue / totalWeights
        const distributedAmount = Math.round(percentage * amount)
        distributedAmounts.push(distributedAmount)
        totalWeights -= weightValue
        amount -= distributedAmount
    })

    return distributedAmounts
}
这似乎是一个好的开始,但实际上我需要向后工作;我试图找出一个函数,它将给我传递到上述函数中的权重

现在,我有这个,一个分为两部分的函数(为冗余道歉):

export const getDistributions=(金额、分布、修改器)=>{
常量值=[]
让amountLeft=金额;
对于(设i=0;i<分布;i++){
常量值=数学最大值(数学四舍五入((amountLeft/(修饰符| | 4))),1)
amountLeft-=值
值。推送(值)
}
// -------------------------------------------- //
//---适用于总值为--//
//---最终大于/小于金额--//
// -------------------------------------------- //
设迭代器=0
让totalAssignedValue=values.reduce((a,b)=>a+b);
const lastIndex=(values.length-1);
常量getIndex=(迭代器,值)=>{
返回迭代器>lastIndex?迭代器%lastIndex:迭代器
}
while(totalAssignedValue>金额){
迭代器=getIndex(迭代器)
if(迭代器!==lastIndex&&iterator!==0&&values[iterator]>1){
值[迭代器]--
}
迭代器++
totalAssignedValue=值。减少((a,b)=>a+b);
}
while(总分配值<金额){
迭代器=getIndex(迭代器)
if(迭代器!==lastIndex&&iterator!==0){
值[迭代器]++
}
迭代器++
totalAssignedValue=值。减少((a,b)=>a+b);
}
// -------------------------------------------- //
//------------结束修正------------------//
// -------------------------------------------- //
返回值;
}
第一部分尝试并分配值,但最终得到的值总是大于或小于输入量,因此方程的第二部分解决了这一问题。看起来有点不干净,而且余数的分布方式有点随意,所以一个纯粹的数学解决方案会很好

我开始怀疑我是否需要微积分,因为我基本上有积分(数组值的和),积分的范围(最小值和最大值),现在必须找出曲线的公式。不过,在这一点上,这可能是矫枉过正


谢谢你的意见

这个怎么样?首先创建集合,使第一个成员为最小值,第二个成员为最小值+1,第三个成员为最小值+2,等等。然后将集合中的数字相加,并从预定值中减去总和。然后将减法的结果分配给集合中的所有数字,如betlow所述

Set makeSet(int preDet, int min, int max, int setLength)
{
    if((max + max - setLength + 1) * setLength / 2 < preDet) return null;
    if((min + min + setLength - 1) * setLength / 2 > preDet) return null;
    Set set = Set(setLength);
    int val = min;
    for (int i = 0; i < setLength; i++)
    {
        set[i] = val++;
    }
    int sum = (min + val - 1) * setLength / 2;
    int dev = preDet - sum;
    if(dev)
    {
        int adj = dev / setLength;
        if(dev % setLength) adj++;
        for(int i = setLength -1; dev; i--)
        {
            if(adj > dev) adj = dev;
            set[i] += adj;
            dev -= adj;
        }
    }
    return set;
}
Set makeSet(int-preset、int-min、int-max、int-setLength)
{
if((max+max-setLength+1)*setLength/2preDet)返回null;
设置=设置(设置长度);
int val=min;
对于(int i=0;idev)adj=dev;
集合[i]+=adj;
dev-=adj;
}
}
返回集;
}

这个怎么样?首先创建集合,使第一个成员为最小值,第二个成员为最小值+1,第三个成员为最小值+2,等等。然后将集合中的数字相加,并从预定值中减去总和。然后将减法的结果分配给集合中的所有数字,如betlow所述

Set makeSet(int preDet, int min, int max, int setLength)
{
    if((max + max - setLength + 1) * setLength / 2 < preDet) return null;
    if((min + min + setLength - 1) * setLength / 2 > preDet) return null;
    Set set = Set(setLength);
    int val = min;
    for (int i = 0; i < setLength; i++)
    {
        set[i] = val++;
    }
    int sum = (min + val - 1) * setLength / 2;
    int dev = preDet - sum;
    if(dev)
    {
        int adj = dev / setLength;
        if(dev % setLength) adj++;
        for(int i = setLength -1; dev; i--)
        {
            if(adj > dev) adj = dev;
            set[i] += adj;
            dev -= adj;
        }
    }
    return set;
}
Set makeSet(int-preset、int-min、int-max、int-setLength)
{
if((max+max-setLength+1)*setLength/2preDet)返回null;
设置=设置(设置长度);
int val=min;
对于(int i=0;idev)adj=dev;
集合[i]+=adj;
dev-=adj;
}
}
返回集;
}

您需要知道的一件事是JavaScript如何存储数字,这可能会扰乱计算(例如,0.1+0.2!==0.3)。例如,请参阅。很棒的电话。。非常感谢。如果您包括示例输入和预期输出,这将非常有帮助。你说你想指定最小值和最大值,有多少个和总和,但似乎没有它们的参数。基本上,我试图得到百分比的分布。所以,总和必须等于100,我想要的最小值是1%。我一直使用50%作为最大值只是为了测试,但它实际上可以是任何东西。例如,我们的想法是得到一组5个不同的百分比,最小值=1%,最大值=50%,剩下的3个介于两者之间,只要这组百分比加起来是100%,您需要知道的一件事是JavaScript如何存储数字,这可能会扰乱计算(例如,0.1+0.2!==0.3)。例如,请参阅。很棒的电话。。非常感谢。如果您包括示例输入和预期输出,这将非常有帮助。您说要指定最小值和