【问题标题】:Quiz scoring algorithm for how close an answer is测验评分算法,了解答案的接近程度
【发布时间】:2014-10-27 12:51:16
【问题描述】:

我正在尝试生成一个小算法,该算法将根据用户的答案与真实答案的接近程度为用户提供 1 分的十进制分数。这些答案将始终是数字,例如“这有多少 x?” 我将为每个答案设置一个合理的最大值和最小值,如果用户的答案超过这个值,他们将一无所获,尽管在创建方程时有点卡住...... 例如,正确答案可以是 100,合理的最小值可以设置为 50。因此,指定 75 的用户将获得 0.5 分

现在可能有点复杂,但最好将分数分配在曲线上,这样结果不是线性的,因此越接近正确答案,权重越高

对于此评分的任何帮助或更好的想法将不胜感激

【问题讨论】:

  • 为什么要投反对票?无论如何,您正在寻找Grading on a curve 的特例。计算MeanStandard Deviation,然后计算百分比。 Check out this work.

标签: algorithm math


【解决方案1】:

公式代码可能是这样的:

score = abs(input - answer) / (answer - min)

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

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

【讨论】:

  • 感谢您的建议。这非常适合线性答案
【解决方案2】:

如果您希望得分是非线性的(以奖励接近答案),您可以尝试“平方差”公式。例如

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

例如正确 = 100,最小值 = 60,答案 = 70 你会得到:

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

如果你想对亲近给予更大的奖励,你可以使用更高的力量。请注意,如果 answer = minimum 将发生除以零。

【讨论】:

    【解决方案3】:

    我用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));
        }
    }
    

    试运行成功

    【讨论】:

    • 非常感谢,这看起来是 Geddes 公式的一个很好的实现
    • 巧合的是相同的算法。写jave类只是花了一些时间,所以我没有及时看到他的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 2020-09-21
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 2015-06-08
    相关资源
    最近更新 更多