Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何根据赛车游戏玩家的完成时间,以公平的方式为他们分配一定数量的奖励点数_Algorithm_Math_Logic_Calculation - Fatal编程技术网

Algorithm 如何根据赛车游戏玩家的完成时间,以公平的方式为他们分配一定数量的奖励点数

Algorithm 如何根据赛车游戏玩家的完成时间,以公平的方式为他们分配一定数量的奖励点数,algorithm,math,logic,calculation,Algorithm,Math,Logic,Calculation,我需要一种我自己无法理解的算法 我最大的问题是我没有好的方法来描述这个问题…:/ 我会这样尝试: 想象一下,你有一个赛车游戏,每个人都可以尝试成为赛道或地图上最快的。每张地图总共值100分。如果有人在一定时间内完成了一张地图,他会在数据库中得到一条记录。如果玩家是第一个也是唯一一个完成这张地图的玩家,他将获得这张地图上所有的100分 现在,这很容易;)但是 现在另一个玩家完成了地图。让我们想象一下,第一个玩家在50秒内完成,第二个玩家在55秒内完成,所以稍微慢一点。我现在需要根据数据库中的两个记

我需要一种我自己无法理解的算法

我最大的问题是我没有好的方法来描述这个问题…:/

我会这样尝试:

想象一下,你有一个赛车游戏,每个人都可以尝试成为赛道或地图上最快的。每张地图总共值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分

我的问题是我想不出一个算法来解决这个问题

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


提前Thx:)

我们可以给每位玩家按时间倒数成比例的分数

一名球员有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.

简单观察:让所有玩家的时间总和为
S
。时间
t
较短的人的
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的计算,则t的计算结果将为负值。@HeikoManfrass将其修复为适用于所有情况,就我目前所知,这将适用于任何秒数,因此我非常喜欢这个:)thx很多:)