0

问题:

如果您访问底部的http://www.newedenfaces.com/ ,您可以看到玩家排行榜。每个人都以1400的基础分数开始。数据库中目前有超过 1100 名玩家,每次投票时都会随机挑选其中两名。截至目前,最高评分为1572。此外排行榜非常不稳定刚刚进入前 10 名的人现在在 70+ 范围内

我希望分数更重要。排行榜中的大多数人仅相差几个评分,有些人甚至评分。

对不起丑陋和冗长的代码。稍后我需要对其进行重构。

eloRating: function(winnerIndex) {

    var kFactor = 16;

    if (winnerIndex == 0) {
      // A won
      var ratingA = this.collection.at(0).get('rating');
      var ratingB = this.collection.at(1).get('rating');

      var scoreA = this.collection.at(0).get('wins');
      var scoreB = this.collection.at(1).get('wins');

      var expectedA = 1.0 / (1.0 + Math.pow(10, ((ratingA - ratingB) / 400)));
      var expectedB = 1.0 / (1.0 + Math.pow(10, ((ratingA - ratingB) / 400)));

      var newRatingA = ratingA + (kFactor * expectedA);
      var newRatingB = ratingB - (kFactor * expectedA);

      this.collection.at(0).set('rating', Math.round(newRatingA));
      this.collection.at(1).set('rating', Math.round(newRatingB));
    } else {
      // B won
      var ratingA = this.collection.at(0).get('rating');
      var ratingB = this.collection.at(1).get('rating');

      var scoreA = this.collection.at(0).get('wins');
      var scoreB = this.collection.at(1).get('wins');

      var expectedA = 1.0 / (1.0 + Math.pow(10, ((ratingB - ratingA) / 400)));
      var expectedB = 1.0 / (1.0 + Math.pow(10, ((ratingB - ratingA) / 400)));

      var newRatingA = ratingA - (kFactor * expectedA);
      var newRatingB = ratingB + (kFactor * expectedA);

      this.collection.at(0).set('rating', Math.round(newRatingA));
      this.collection.at(1).set('rating', Math.round(newRatingB));
    }
4

2 回答 2

1

您的预期分数等式不正确。例如,根据您的等式,高 400 分的人的预期得分为 10/11 (0.909)。这是不对的,因为实际获胜的概率要高于这个(大约 0.919)。这是真正的方程式:

ELO获胜概率

其中 D 是标准差中的点数(通常为 400 点)。该方程没有封闭形式,因此必须使用预先计算的值表。

此外,更重要的是,您没有正确计算调整。获胜者获得 (1- e )**k* 分。失败者失去 ( e )**k* 分,其中e是玩家的预期得分。因此,如果玩家 A 比 B 高 400 分并且获胜,那么他得到 (1-0.919)*k = 1.296 分,而输家输掉 1.296 分。在您的计算中,获胜者将获得 14.7 分(!!!),而失败者将失去 14.7 分。

于 2013-06-12T23:04:11.140 回答
1

这是我的第一篇文章,但我想出了这个,它似乎是一种相当简洁的方法。

我希望它可以帮助某人。

var aElo = 1400; // player
var bElo = 1400; // opponent
var Res  = 1     // Result... 0.5 = draw, 1 = win, 0 = loss

var nElo = aElo+Math.round((32-((Math.floor(aElo/2101)+Math.floor(aElo/2401))*8)) * (Res - (1 / (1 + Math.pow(10, -(aElo - bElo) / 400)))));

alert("Players Elo was "+aElo+" but is now "+nElo);
于 2018-02-10T15:23:43.880 回答