将线性除法函数转换为对数

时间:2014-08-18 11:40:43

标签: loops math division

我不确定我是否使用了正确的数学术语,但这里有......

我目前有一个函数可以将数字平均除以另一个数字。

function factorIt(numPieces, totalSize) {
    return totalSize / numPieces;
}

返回线性/偶数除法。我需要做的是返回形成不均匀/指数/对数集的值。

例如,运行10次以上的函数,在值500和10上将返回50次,因为500除以10是50.但我需要它返回更像的东西:

1, 2, 5, 10, 20, 30, 60, 100, 150, 200 // All should add up to input value

这10个值实际上总计达到了578,但是该功能需要它加起来为500的输入值。这是我目前所拥有的..

var output = '';
for (var i = 1; i<11; i++) {
    output += factorIt(i, 10, 500) + '<br>';
}
function factorIt(i, numPieces, totalSize) {
    var factor = 5;
    return totalSize / numPieces / i * factor; // Err...something like this... :-S
}

此功能的最终目标是在二维空间上绘制位图,并在它们之间不断缩小的空间,以创建3d后退透视的幻觉。

有谁知道我需要的配方?我似乎无法绕过它......

1 个答案:

答案 0 :(得分:0)

您的问题没有详细说明如何获取序列“1,2,5,10,20,30,60 ......”。如果您需要将值设置为整数,也不指定。

如果你想要一个加上给定总数的“准指数”序列,你可以通过某些固定因子使用连续除法:

var current = 500;
while (current > 0) {
  var new = ceil(current / 2);
  output = new + '<br>' + output;
  current = current - new;
}

这将生成“1,2,4,8,16,31,63,125,250”,总计为500. ceil是天花板函数,即大于或等于其参数的最大整数(总是“四舍五入”)。您还可以使用不同的因子来生成更短的序列(更小的因子)或更长的序列。

请注意,循环以按顺序生成值,即从最大值开始。此方法也可能在序列的开头产生1的重复值(如果以2的任何幂开始...)

此外,此方法不允许您指定序列中元素的数字。如果你想拥有固定大小的序列,你可以尝试通过与

类似的方式计算因子
f = exp(ln(total)/n)

但是,如果你只对整数值进行操作,则可能需要修改此因子以获得正确的结果。