如何在Kotlin中编写距离越短得分越高的评分公式?
距离相关评分公式实现方案
根据你需求的「距离越近分数越高、越远越低,超过最大距离得0分」,这里提供几种实用的公式实现方案,直接适配你给出的Kotlin代码框架:
1. 线性评分(最常用、直观)
这种方案是分数随距离均匀衰减,距离为0时拿满分1000,达到maxDistance时得0分,中间按比例计算。适合需要公平对应距离的场景。
补全后的代码:
fun rating(distance: Float): Int { val maxDistance = 11750F val fullScore = 1000 return if (distance > maxDistance) { 0 } else { // 计算比例后转整数,可根据需求用toInt()直接截断或roundToInt()四舍五入 ((1 - distance / maxDistance) * fullScore).roundToInt() } }
2. 非线性评分(侧重近距离优势)
如果需要让近距离的分数衰减更慢,或者远距离分数掉得更快,可以用幂次函数调整衰减曲线。比如平方项会让近距离的分数更稳定,只有距离接近最大值时才快速降到0。
补全后的代码:
fun rating(distance: Float): Int { val maxDistance = 11750F val fullScore = 1000 val decayPower = 2.0 // 幂次越大,近距离分数越稳定,远距离衰减越快 return if (distance > maxDistance) { 0 } else { val ratio = distance / maxDistance ((1 - Math.pow(ratio.toDouble(), decayPower)) * fullScore).roundToInt() } }
3. 反向指数衰减
另一种非线性方案是用指数函数,适合需要极近距离拿高分,超过一定距离快速降分的场景:
fun rating(distance: Float): Int { val maxDistance = 11750F val fullScore = 1000 val decayFactor = 0.0005 // 因子越大,衰减速度越快 return if (distance > maxDistance) { 0 } else { // e的负距离*衰减因子次方,再乘以满分 (Math.exp(-decayFactor * distance) * fullScore).roundToInt() } }
选择建议
- 选线性评分:需要分数和距离成严格反比、逻辑简单易懂的场景
- 选非线性评分:需要突出近距离优势,或者弱化远距离差异的场景
- 选指数衰减:需要极近距离的目标获得显著高分的场景
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

