如何为指数衰减设置指定范围(从20降至5)?
实现固定范围的指数递减序列
你原来的代码用固定底数2做衰减,导致第2步就降到了5,后续还会继续下降,不符合6步从20到5的需求。要实现指定范围的指数递减,需要先计算合适的衰减率,而不是硬用固定底数。
推导思路
指数衰减的通用公式可以表示为:当前值 = 最大值 × (衰减率)^(步数-1)
我们需要满足:第1步值为max(20),第x(6)步值为min(5),代入公式可得:
5 = 20 × (衰减率)^(6-1)
计算得衰减率:衰减率 = (5/20)^(1/5) ≈ 0.75786
修改后的代码
const data = [] const x = 6 const max = 20 const min = 5 // 计算精准衰减率 const decayRate = Math.pow(min / max, 1 / (x - 1)) for (let index = 1; index <= x; index++) { // 按指数公式计算当前值 let value = max * Math.pow(decayRate, index - 1) // 最后一步强制用min,避免浮点数计算误差 data.push(index === x ? min : value) } console.log(data)
运行后输出结果(保留三位小数):
20, 15.157, 11.491, 8.707, 6.599, 5
更简洁的写法
也可以直接在循环里计算指数,不用单独声明衰减率:
const data = [] const x = 6 const max = 20 const min = 5 for (let index = 1; index <= x; index++) { const exponent = (index - 1) / (x - 1) let value = max * Math.pow(min / max, exponent) data.push(index === x ? min : value) }
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

