我正在尝试生成一个小算法,根据答案与真实答案的接近程度,为用户提供1的小数分数。这些答案将始终是数字,并且是“有多少x这样做的?” 我会为每个答案设置一个合理的最大值和最小值,如果用户的答案超过这个,他们将得不到任何东西,虽然有点卡住得到一个等式创建... 例如,正确答案可以是100,合理的最小值可以设置为50.因此,指定75的用户将得到0.5的分数
现在也许有点复杂但是在曲线上分配分数也很不错,所以结果不是线性的,因此权重越高,越接近正确的答案
非常感谢任何有关此评分的帮助或更好的想法
答案 0 :(得分:2)
公式代码可能是这样的:
得分=绝对(输入 - 回答)/(回答 - 分钟)
对于您的示例,我们有input = 75
,answer = 100
和min = 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));
}
}
测试运行成功