我试图找到规范化的技巧(不确定这是否是正确的词)一系列数字。
说我有一个数组:
[0,1,2,3,4,70,80,900]
我想展平或平均范围曲线,所以它更像是:
[10,11,12,13,14,50,100,300]。 //不是真正的计算
因此,与减少较大的数字相比,增加较小的数字。
这种技术叫做什么?标准化规模?我希望在一些Javascript中实现这一点。
更新:希望能够更好地描述我尝试做的事情:
我有一组原始数字:
[0, 10, 15, 50, 70, 100]
通过function averageOutAllNumbers(array, slider)
进行处理时,会生成slider
设置为100%时的数组:
[0, 20, 40, 60, 80, 100] // the curve has been flattened
当滑块设置为0%
时,它将返回原始数组。如果slider
设置为50%
,则返回的数组将显示为某些内容:
[0, 12, 19, 52, 88, 100] // the curve is less steep [do not take these number literally, I'm guess what the output would be based on the slider].
array.max()
总是100
。
答案 0 :(得分:0)
感谢迄今为止的评论,他们确实让我更接近解决方案。 不,谢谢那些投票的巨魔;如果你无法修复它,没有人可以做到!
当我更新我的问题时,我意识到"增加与减少较大数字相关的较小数字" 最终将导致均匀分布的数字集,例如[20, 20, 20, 20, 20]
。但是我确实想要像我在问题中所说的那样:[0, 20, 40, 60, 80, 100] // the curve has been flattened
。我做了一些搜索,比如:
在搜索结果列表中,我看到了原始问题的答案:"这种技术叫做什么?" Linear Interpolation
基于此,我能够创建以下内容:
var orig = [3, 11, 54, 72, 100];
function lerp(n, x0, x1) {
// returns a position: x that is n percent between y0 and y1
// As numbers in array are x only, y values are fixed to 0(start) - 1(end)
const y0 = 0;
const y1 = 1;
const x = ((y1 - n)*x0 + (n - y0)*x1) / (y1 - y0);
return x;
}
var flattenedEven = orig.map((value, index, arr) => {
return lerp(1, value, (Math.max(...arr)/arr.length) * (index + 1));
});
//=> [20, 40, 60, 80, 100]
var flattenedCurve = orig.map((value, index, arr) => {
return lerp(.7, value, (Math.max(...arr)/arr.length) * (index + 1));
});
//=> [14.9, 31.3, 58.2, 77.6, 100]