【问题标题】:How to devide some fixed amount of reward points to players of a racing game in a fair way depending on their finishing time如何根据完成时间公平分配一定数量的奖励积分给赛车游戏的玩家
【发布时间】:2021-04-10 18:18:16
【问题描述】:

遗憾的是,我需要某种我自己无法弄清楚的算法。

我最大的问题是我没有很好的方式来描述这个问题...:/

我会这样尝试:

假设您有一个赛车游戏,每个人都可以在赛道或地图上尝试成为最快的。每张地图总价值 100 点。如果有人在一段时间内完成了一张地图,他会在数据库中获得一条记录。如果玩家是第一个也是唯一一个完成此地图的玩​​家,他将获得该地图的所有 100 分。

现在,这很容易;)但是...

现在另一个玩家完成了地图。让我们假设第一个玩家在 50 秒内完成,第二个玩家在 55 秒内完成,所以有点慢。我现在需要根据数据库中的两条记录进行计算。两位玩家现在都获得了 100 分的一部分。较快的玩家比较慢的玩家多一点。假设他们完成的时间完全相同,他们都将从 100 中获得 50 分,但由于第一个稍微快一点,他现在获得了大约 53 分,而速度较慢的玩家只有 47 分。

我开始这样计算:

两条记录之和为 105 秒,速度较快的玩家占其中的 50/105,因此他获得 100-(50/105*100) 分,而较慢的玩家获得 100-(55/105*100) 分.关键是,分配给玩家的所有分数总和总是等于 100。这适用于 2 名玩家,但在 3 名及以上时会中断。

例如:

玩家 1:20 秒

玩家 2:20 秒

玩家 3:25 秒

计算如下:

玩家 1:100-(20/65*100) = 69 分

玩家 2:100-(20/65*100) = 69 分

玩家 3:100-(25/65*100) = 61 分

这将不再加起来总共 100 分。

公平是指以下价值观:

玩家 1 和 2(同时)= 35 分

玩家 3 = 30 分

我的问题是我找不到解决这个问题的算法。

对于任何数量的玩家,我都需要相同的算法。有人可以帮忙出主意吗?我不需要一个完整的算法,也许只是一个想法,我在哪一步使用了错误的想法,也许所有时间的总和已经是一个糟糕的开始。

提前谢谢 :)

【问题讨论】:

    标签: algorithm math logic calculation


    【解决方案1】:

    我们可以给每个玩家的分数与其时间的倒数成正比。

    一个有 t 秒的玩家获得 100 × (1/t) / (1/t) = 100 分。

    两位玩家中,50 秒的玩家得到 100 × (1/50) / (1/50 + 1/55) ≈ 52.4,55 秒的玩家得到 100 × (1/55) / (1 /50 + 1/55) ≈ 47.6。

    三位玩家中,20 秒的获得 100 × (1/20) / (1/20 + 1/20 + 1/25) ≈ 35.7,25 秒的获得 100 × (1/ 25) / (1/20 + 1/20 + 1/25) ≈ 28.6。

    【讨论】:

    • 据我现在所知,这可以在任何秒数内工作,所以我喜欢这个 rlly :) 非常感谢 :)
    【解决方案2】:

    简单观察:让所有玩家的时间总和为St 时间较短的人将具有较高的 S-t 值。因此,您可以为每个玩家奖励与S-t 成比例的积分。

    公式:
    N 玩家的分数为a,b,c...,m,n。总和S = a+b+c...+m+n。那么给定玩家的得分将是

    score = [S-(player's score)]/[(N-1)*S] * 100
    

    你可以很容易地看到,使用这个公式,所有玩家的得分总和总是100。

    示例 1:

    S = 50 + 55 = 105, N-1 = 2-1 = 1
    Player 1 : 50 seconds => score = ((105-50)/[1*105])*100 = 52.38
    
    Player 2 : 55 seconds => score = ((105-55)/[1*105])*100 = 47.62
    

    同样,对于您的第二个示例,

    S = 20 + 20 + 25 = 65
    N - 1 = 3 - 1 = 2
    For Player 1, (S-t) = 65-20 = 45
    Player 1's score => (45/(2*65))*100 = 34.6 
    Player 2 => same as Player 1  
    For Player 3, (S-t) = 65-25 = 40
    Player 3's score => (40/(2*65))*100 = 30.8
    

    这种方法避免了中间状态的任何除法,因此计算不会出现浮点问题。

    【讨论】:

    • 我明白了,但是超过 100 秒的时间呢?如果有人在 3 分钟内完成,则 t 的计算将是负数。
    • @HeikoManfrass 已修复它以适用于所有情况
    猜你喜欢
    • 2019-10-20
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    相关资源
    最近更新 更多