Ruby / Rails中数字范围的线性转换

时间:2015-02-17 12:43:54

标签: ruby-on-rails ruby

我的问题与此问题有关:Convert a number range to another range, maintaining ratio

我有一个模型Contest,其中包含许多Teams,它通过一段时间内的活动积累积分。球队的规模不同,我正计算每个球队的差点因素,以便调整相对于球队规模的分数:

   Team.rb: 

   def handicap_factor
      return (contest.total_users / contest.teams.count.to_f) / self.total_users
   end

这会返回一个十进制值,我乘以团队的总积分得到一个加权点得分:

    Team.rb:

    def adjusted_points
      return (points * handicap_factor).ceil
    end

以下是一些样本障碍因素:

 team1.handicap_factor: 1.73125
 team2.handicap_factor: 0.6925
 team3.handicap_factor: 1.08203125
 team4.handicap_factor: 0.721354

现在,我想转换差点因素的范围,使最低值为1(这样即使对于具有最低差点因素的球队,一个动作至少产生一个点),同时保持比率为它们之间的区别。

我不确定ContestTeam模型之间的正确架构是什么。我想我可以在Contest.rb上添加一个方法来返回将最低的team.handicap_factor转换为1所需的乘法因子,然后将方法添加到Team.rb以乘以team.handicap_factor。

这是解决这个问题的合理方法吗?或者,有更有效的方法来处理这个吗?

1 个答案:

答案 0 :(得分:0)

我认为你在这里遇到了潜在的数学问题。让我们一步一步地完成它。

让我们说从

开始
team_a.handicap_factor = 0.5
team_b.handicap_factor = 1

现在,team_b的差点是team_a的两倍,我们希望最小值为1.因此,team_a的adjusted_handicap应为1,team_b的adjust_handicap需要增加到2,为team_a的两倍。

到目前为止一切顺利。正确?

然后,team_c出现了未经调整的0.4的差点。与team_a相比,未调整的比率是0.4 / 0.5 = 0.8,我们仍然希望我们的最小值为1.因此,我们将team_c的调整差点设置为1,这意味着我们需要提高每个人的调整后的差点否则为了保持比率与团队c相比。换句话说,有一个新的缩放因子可以从handicap_factor变为adjust_handicap,其他人都会将这个缩放因子应用于他们的分数。这里的新缩放因子是1 / 0.4 = 2.5。那么,现在我们遇到了这种情况:

Scaling factor = 1/<lowest unadjusted handicap> = 1/0.4 = 2.5

team           handicap_factor          adjusted handicap
team_a         0.5                      1.25
team_b         1                        2.5
team_c         0.4                      1

因此,每当出现新的最低差点时,其他所有人的调整后的差点都会上升。这绝对是你想要的吗?

如果它 你想要什么,那么你想要开始在数据库中存储handicap_factor,以便你快速获得任何团队的最低障碍因子,而无需加载所有团队并计算它以查看哪个最低。