cqwcns 发表于 2023-2-17 09:17

JS计算线性得分的问题

我希望根据排名,计算出得分。
首先我们有两组变量,得分范围arrScoreRange,排名范围arrRankRange。

即当传入排名为1时,返回得100分,传入排名为31时,返回得0分,其他排名线性得分。

数学基础差,不知道应该这么实现,请各位大佬指教,感谢。

                const arrScoreRange = ,
                  arrRankRange = ;

zach14c 发表于 2023-2-17 09:32

function calculateScore(rank) {
if (rank === 1) {
    return 100;
} else if (rank > 1 && rank <= 30) {
    return 100 - (rank - 1) * 3.2258;
} else {
    return 0;
}
}

document.write(calculateScore(1));
document.write("<br>");
document.write(calculateScore(2));
document.write("<br>");
document.write(calculateScore(10));
document.write("<br>");
document.write(calculateScore(30));
document.write("<br>");
document.write(calculateScore(31));
document.write("<br>");
document.write(calculateScore(32));

sunsjw 发表于 2023-2-17 09:38

chatGPT应该可以帮助你解决问题。

Pwaerm 发表于 2023-2-17 09:39

把得分数组按分数从高到低排序,然后直接返回array[排名]

cqwcns 发表于 2023-2-17 09:52

zach14c 发表于 2023-2-17 09:32
function calculateScore(rank) {
if (rank === 1) {
    return 100;
...

测试功能实现,请教一下3.2258是什么意思?感谢

cqwcns 发表于 2023-2-17 09:55

zach14c 发表于 2023-2-17 09:32
function calculateScore(rank) {
if (rank === 1) {
    return 100;
...

这样好像写死了,如果范围不是1至31,而是1至16,就不能正确计算得分了。

cqwcns 发表于 2023-2-17 10:03

本帖最后由 cqwcns 于 2023-2-17 10:07 编辑

自己根据楼上的代码,改了一下,加了一共最大排名参数maxRank,就解决问题了。

                function calculateScore(rank, maxRank = 16) {
                  return Math.max(100 - (rank - 1) * (100 / (maxRank - 1)), 0);
                }

感谢各位指教。

zach14c 发表于 2023-2-17 10:03

cqwcns 发表于 2023-2-17 09:55
这样好像写死了,如果范围不是1至31,而是1至16,就不能正确计算得分了。

线性插值
https://wiki.mbalib.com/w/images/math/3/6/d/36d5fe6bef62d0313a73616f0a5fd69d.png

cqwcns 发表于 2023-2-17 10:08

zach14c 发表于 2023-2-17 10:03
线性插值

这样好像就解决了,感谢大佬。

function calculateScore(rank, maxRank = 16) {
    return Math.max(100 - (rank - 1) * (100 / (maxRank - 1)), 0);
}
页: [1]
查看完整版本: JS计算线性得分的问题