反向的Elo算法

问题描述:

我实现ELO算法但它是在完全相反的方式工作,我混合的结果(赢设置在哪里失去的,相反的。)这小小的细节辜负我的结果 - 为什么问题是,这就是 - 我怎样才能扭转?反向的Elo算法

我只有新的Elo老ELO因为我是garhering统计..

我的算法是完全一样的wiki: https://en.wikipedia.org/wiki/Elo_rating_system#Theory

是:

public class EloAlgorithm { 

    public static Integer calculateRating(Integer myRating, Integer opponentRating, EloGameResultValue result) { 
     myRating += calculateEloDelta(myRating, opponentRating, result); 
     if (myRating<0){ 
      return 0; 
     } 
     return myRating; 
    } 

    private static Integer calculateEloDelta(Integer myRating, Integer opponentRating, EloGameResultValue result){ 
     Double myChanceToWin = 1/(1 + Math.pow(10, (opponentRating - myRating)/400)); 
     Long eloDelta = Math.round(getKFactor(myRating) * (result.getValue() - myChanceToWin)); 
     return eloDelta.intValue(); 
    } 

    private static double getKFactor(Integer myRating) { 
     if(myRating < 2100) return 32.0; 
     else if(myRating >= 2100 && myRating < 2400) return 24; 
     else return 16; 
    } 
} 

我试着扭转它,但可能我没有在我的计算错误:

public static Integer fetchOponentRatingFromDifference(int myOldRating, int myNewRating, EloGameResultValue result){ 
    double delta = myNewRating - myOldRating; 

    double k = getKFactor(myOldRating); 
    double myChanceToWin = (k* result.getValue() - difference)/k ; 

    double log = Math.log10(1/myChanceToWin - 1); 
    Double resultToReturn = 400*log + myOldRating; 

    return (int)Math.round(resultToReturn); 
} 

你能帮我找到一个错误或推荐更好的解决方案吗?

编辑:由于被请求:

我经由的JUnit

public class EloValueBinaryFinderTest { 
    @Test 
    public void eloValueFinderTest(){ 
    System.out.println(
     EloValueBinaryFinder.fetchOponentRatingFromDifference(952,968) 
    ); 
} 

}

与此然而主要方法将是测试:

public class EloValueBinaryFinderTest { 
     public static void main(String... args){ 
     System.out.println(
     EloValueBinaryFinder.fetchOponentRatingFromDifference(952,968) 
    ); 
    } 
} 

EloGameResultValue作为必要只是一个枚举:

public enum EloGameResultValue { 
WIN(1), 
DRAW(0.5), 
LOSE(0); 

Double value; 

EloGameResultValue(double value) { 
    this.value = value; 
} 

public Double getValue() { 
    return value; 
} 


public Boolean isWin() { 
    if(value.equals(1.0)){ 
     return true; 
    } 
    if(value.equals(0.0)){ 
     return false; 
    } 
    return null; 
} 

} 
+0

的UE'int'而不是'Integer'和'double'而不是'double'当你不强制,更容易,您能不能给测试主要方法? – azro

+0

请来到这里https://chat.*.com/rooms/info/150213/elo-algo?tab=general更好说话 – azro

+1

和谨慎与整数除法:例如'380/400 = 0',同时'(双)380/400 = 380.0/400 = 380/400.0 = 0.95' –

好吧,我解决这个问题,计算是好的,但执行是错误的:)

的第一个错误是由好@Carlos Hauberger发现

第二个,是我的错误 - 对数只能取正值作为参数为负的原因NaN的