vector<string> players;
map<string, int> player_map;
float ratings[MAX_PLAYERS];
+ float ratings_stddev[MAX_PLAYERS];
bool has_scores[MAX_PLAYERS][MAX_PLAYERS];
for (int pl1 = 0; pl1 < num_players; ++pl1) {
for (int pl2 = 0; pl2 < num_players; ++pl2) {
int scores[MAX_PLAYERS][MAX_PLAYERS];
for (int i = 0; i < num_players; ++i) {
char buf[256];
- float rating;
- int ret = scanf("%s %f", buf, &rating);
+ float rating, rating_stddev;
+ int ret = scanf("%s %f %f", buf, &rating, &rating_stddev);
if (ret < 1) {
fprintf(stderr, "Couldn't read player %d\n", i);
exit(1);
}
- if (ret != 2) {
+ if (ret < 2) {
rating = 1500.0f;
}
+ if (ret < 3) {
+ rating_stddev = 0.0f;
+ }
players.push_back(buf);
player_map[buf] = i;
ratings[i] = rating;
+ ratings_stddev[i] = rating_stddev;
}
for ( ;; ) {
}
for (int i = 0; i < trials; ++i) {
+ // draw true strength for all players
+ float drawn_ratings[MAX_PLAYERS];
+ for (int p = 0; p < num_players; ++p) {
+ drawn_ratings[p] = draw_gaussian(ratings[p], ratings_stddev[p]);
+ }
+
// draw the missing matches
for (int pl1 = 0; pl1 < num_players; ++pl1) {
for (int pl2 = pl1 + 1; pl2 < num_players; ++pl2) {
continue;
}
- float mu = ratings[pl1] - ratings[pl2];
+ float mu = drawn_ratings[pl1] - drawn_ratings[pl2];
int score = lrintf(draw_gaussian(mu, match_stddev));
scores[pl1][pl2] = score;