Initial rating

From NASPAWiki

You are viewing a condensed mobile version of this NASPA webpage.
Switch to full version.

Here are four explanations of how ratings are computed for newcomers (players who do not have a previous rating) at a tournament, in order of increasing accuracy and technical detail. Questions should be directed to John Chew.


A newcomer’s initial rating is the rating s/he would have had to have had in order for his/her rating to have remained unchanged after their first tournament.


If there is only one newcomer in a division, then the newcomer receives an initial rating equal to their performance rating (the rating the newcomer would have had to have had before the event in order for it to have remained unchanged), except that if their initial rating would be less than 500, it is raised to 500, and if it would exceed the newcomer’s strongest opponent’s rating by more than 400 times the newcomer’s winning percentage, it is decreased until it does not.

If there is more than one newcomer, then they are assigned provisional ratings equal to their average opponent rating, which are then repeatedly replaced by their performance ratings until the ratings stablise.


  • For each rated player rp
    • Set the iterative rating for rp to their pre-event rating
  • For each newcomer nc
    • Set the iterative rating for nc to the mean of their rated opponent ratings, if any, else 1500
    • Set nc’s earned wins to the number of games won by nc at this event not including byes or forfeits
    • Set nc’s rated games to the number of games played by nc at this event not including byes or forfeits
    • Define a function IPRnc(r) as follows
      • Set earned_wins = nc’s earned wins
      • If earned_wins = 0
        • then Set earned_wins to 5% * nc’s rated games
      • else if earned_wins = rated_games
        • then Set earned_wins to 95% * nc’s rated games
      • Set excess_wins = (sum of expected wins of a player rated r vs. opponents whose ratings are the iterative ratings of the opponents of nc) - earned_wins
      • Return excess_wins
  • Repeat 50 times
    • For each newcomer nc
      • Perform a binary search for an integer value r in [0,3000] stopping when the search range is less than or equal to one, setting the low (high) end of the range equal to the floor of the middle of the range when IPRnc(r) is <0 (≥0)
      • If r < 500
        • then Set r to 500
      • Set maximum_rating to (greatest among pre-event rating of nc’s rated opponents or iterative rating of nc’s unrated opponents) + 400 * nc’s earned wins / nc’s rated games
      • if r > maximum_rating
        • then Set r to maximum_rating
      • Set nc’s next rating to r
    • For each newcomer nc
      • Set nc’s iterative rating to nc’s next rating
    • If all iterative ratings were equal to next ratings
      • then stop repeating now without continuing to the 50th iteration
  • If fewer than 50 iterations were required
    • For each newcomer nc
      • Set nc’s new rating to nc’s iterative rating
  • Else
    • Perform 50 more iterations
    • For each newcomer nc
      • Set nc’s new rating to the mean of nc’s last 50 iterative ratings

Reference implementation

The reference implementation of the rating algorithm is in Perl and can be found as part of the tsh software distribution in the Ratings::Elo::RateNewcomersCorrectly() method.