关于答案接近程度的测验评分算法

时间:2014-10-27 12:51:16

标签: algorithm math

我正在尝试生成一个小算法,根据答案与真实答案的接近程度,为用户提供1的小数分数。这些答案将始终是数字,并且是“有多少x这样做的?” 我会为每个答案设置一个合理的最大值和最小值,如果用户的答案超过这个,他们将得不到任何东西,虽然有点卡住得到一个等式创建... 例如,正确答案可以是100,合理的最小值可以设置为50.因此,指定75的用户将得到0.5的分数

现在也许有点复杂但是在曲线上分配分数也很不错,所以结果不是线性的,因此权重越高,越接近正确的答案

非常感谢任何有关此评分的帮助或更好的想法

3 个答案:

答案 0 :(得分:2)

公式代码可能是这样的:

  

得分=绝对(输入 - 回答)/(回答 - 分钟)

对于您的示例,我们有input = 75answer = 100min = 50所以:

  

得分= abs(75-100)/(100-50)= 25/50 = 0.5

答案 1 :(得分:1)

如果您希望得分是非线性的(为了奖励与答案的接近程度),您可以尝试“平方差异”公式。 E.g。

score = 1 - (abs((answer - input)/(answer - minimum)))^2

e.g。正确= 100,最小= 60,答案= 70,你会得到:

score = 1 - (abs((100 - 70)/(100 - 60)))^2 = 0.4375

如果你想为亲密度给予更大的回报,你可以使用更高的力量。请注意,如果answer = minimum,则会出现除零。

答案 2 :(得分:1)

我用Java实现了算法,并做了一个小测试用例。

public class Quiz{

    public static double calculateScore(int input, 
                                        int correctAnswer, 
                                        int minimumAnswer){

        if(input == correctAnswer){
            return 1;
        }

        double correctInterval = Math.abs(correctAnswer - minimumAnswer);
        double relativeAnswer = Math.abs(correctAnswer - input);


        if(relativeAnswer > correctInterval){
            return 0;
        }else{
            double score = relativeAnswer/correctInterval;

            score *= score;// make ^2 to avoid a linear progression

            return 1.0 - score;
        }
    }
}


public class QuizTest{

    @Test
    public void testCalculateScore() {

        assertTrue(0 == Quiz.calculateScore(5, 20, 15));
        assertTrue(0 == Quiz.calculateScore(30, 20, 15));
        assertTrue(1 == Quiz.calculateScore(20, 20, 15));
        assertTrue(0 < Quiz.calculateScore(17, 20, 15));
        assertTrue(0 < Quiz.calculateScore(22, 20, 15));
        assertTrue(Quiz.calculateScore(18, 20, 15) == Quiz.calculateScore(22, 20, 15));

        assertTrue(Quiz.calculateScore(17, 20, 15) < Quiz.calculateScore(22, 20, 15));
    }
}

测试运行成功