确定从分数的一部分给出的星数

时间:2010-08-24 10:17:45

标签: c#

数学不是我的优点之一,我想知道如何做到这一点正确(我可以一起破解,但这会很乱):

  • 我们对模块进行评分,并以百分比给用户分数
  • 我们希望以星级评分奖励这些分数,但前提是他们的分数高于模块分数
  • 通过标记是可变的
  • 为了进一步打样,我们可以说明星的数量也是可变的
  • 如果他们通过,我希望他们总能得到至少一颗星

示例图:

  • Max Stars:3
  • 通行证:75%
  • 用户得分75%,最低标记,因此奖励1星
  • 用户得分90%,这会是2星吗?

谢谢你们。


集成解决方案

这就是我的目的:

private const int NUMSTARS = 3;

public int starsFor(int pScore, int pPassMark)
{
    if(pScore < pPassMark)
    {
        return 0;
    }
    else if (pScore == pPassMark)
    {
        return 1;
    }
    else
    {           
        return (int)Math.Ceiling(NUMSTARS * ((pScore - pPassMark) / (double)(100 - pPassMark))); 
    }
}

4 个答案:

答案 0 :(得分:5)

这是一个Java实现; C#翻译应该很简单。这假定为linear interpolation

    public static int starsFor(int mark, int passMark, int numStars) {
            if (mark < passMark) 
                    return 0;
            else if (mark == passMark)
                    return 1;
            else 
                    return (int) Math.ceil(
                            numStars * (
                                    (mark - passMark) / (double) (100 - passMark)
                            )
                    );
    }

然后我们有(as seen on ideone.com):

System.out.println(starsFor(70, 75, 5)); // 0
System.out.println(starsFor(75, 75, 5)); // 1
System.out.println(starsFor(80, 75, 5)); // 1
System.out.println(starsFor(81, 75, 5)); // 2
System.out.println(starsFor(93, 75, 5)); // 4
System.out.println(starsFor(99, 75, 5)); // 5
System.out.println(starsFor(100, 75, 5)); // 5

C#/变异

这是一个略微变化,也处理额外的点。它使用整数除法,不需要double强制转换和Math.ceil。使用Ternary/conditional ?: operator(对于样式!)。

  static int starsFor(int mark, int passMark, int maxMark, int numStars) {
    return
      (mark >= maxMark) ?
         numStars
         :
      (mark < passMark) ?
         0 
         :
      1 + numStars * (mark - passMark) / (maxMark - passMark);
  }

然后我们有(as seen on ideone.com):

Console.WriteLine(starsFor(50, 75, 100, 5)); // 0
Console.WriteLine(starsFor(75, 75, 100, 5)); // 1
Console.WriteLine(starsFor(79, 75, 100, 5)); // 1
Console.WriteLine(starsFor(80, 75, 100, 5)); // 2
Console.WriteLine(starsFor(93, 75, 100, 5)); // 4
Console.WriteLine(starsFor(100, 75, 100, 5)); // 5
Console.WriteLine(starsFor(110, 75, 100, 5)); // 5 no extra stars!

答案 1 :(得分:3)

以下功能可能会给您预期的结果 我使用的逻辑:
- 如果通过标记为75%,则75%= 1星级 - 并且您希望为用户提供最多5颗星 - 然后将剩余标记分成5个相等的部分(75到80,81到85,86到90,91到95和96 100)
- 根据此范围应用星星。

public int RateMyUser(int MaxStars, int MinThreshold, int MarksObtained)
    {
        int division = 0;
        int stars = 0;
        // this will give division of remaining score greater than passing percentage<br>
        division = (100 - MinThreshold) / MaxStars;
        if (MarksObtained >= MinThreshold)
        {
            // obtain the stars to be given
            stars = (MarksObtained - MinThreshold) / division; // integer representing stars
            return stars + 1;
        }
        return stars;
    }

答案 2 :(得分:1)

这取决于分数的(预期)分布是什么以及星星的分布应该是什么。

对于线性分数和线性星的最简单示例,您可以使用以下内容:

Math.Max(0, ((score - passMark) / (100 - passMark) * (maxStars - 1)  + 1))

答案 3 :(得分:1)

这应该可以解决问题,即使它是C99

int GetStarCount(double scorePercentage, int maxStars, double PassMark)
{
  double classwidth = (1.0 - PassMark) / (double)(maxStars-1);
  double delta = scorePercentage - PassMark;
  if(scorePercentage < PassMark)
    return 0;
  return ceil(delta / classwidth)+1; 
}

<强>更新 我应该写一下参数预计在0..1的范围内......(75%的密码== 0.75作为参数值)。