X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mcwordfeud.cpp;h=ce9dc5fd482058895b2577817d1282d51e955e6f;hb=85aad5a8139585bbf96ddbccbac224c71949fc1a;hp=c8d28a47b85bcf933374d49f1339378bcd4bee31;hpb=464befbe16de81e327e2317ac88aaab2311fbcdb;p=wloh diff --git a/mcwordfeud.cpp b/mcwordfeud.cpp index c8d28a4..ce9dc5f 100644 --- a/mcwordfeud.cpp +++ b/mcwordfeud.cpp @@ -80,13 +80,14 @@ int main(int argc, char **argv) } if (num_players > MAX_PLAYERS) { - fprintf(stderr, "Max %d players supported\n"); + fprintf(stderr, "Max %d players supported\n", MAX_PLAYERS); exit(1); } vector players; map 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) { @@ -97,19 +98,23 @@ int main(int argc, char **argv) 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 ( ;; ) { @@ -143,6 +148,12 @@ int main(int argc, char **argv) } 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) { @@ -150,7 +161,7 @@ int main(int argc, char **argv) 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;