From e27ed7e95658c16f16d24e55e788947a359f3877 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Tue, 11 Aug 2015 11:00:28 -0400 Subject: Optimized C++ version. --- scheduling/scheduling.cc | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/scheduling/scheduling.cc b/scheduling/scheduling.cc index bd1f6bb..6b03e31 100644 --- a/scheduling/scheduling.cc +++ b/scheduling/scheduling.cc @@ -91,7 +91,7 @@ template vector> GenerateMatches( GeneratorT generator, vector players) { - std::list> possible_matches; + std::vector> possible_matches; for (int i = 0; i < players.size(); i++) { for (int j = 0; j < players.size(); j++) { // X vs. y and y vs. x is the same match. Also excludes x vs. x. @@ -102,18 +102,13 @@ vector> GenerateMatches( } } } + std::shuffle(possible_matches.begin(), possible_matches.end(), + generator); vector> result; - while (!possible_matches.empty()) { - std::uniform_int_distribution distribution( - 0, possible_matches.size() - 1); - int i = distribution(generator); - auto it = possible_matches.begin(); - std::advance(it, i); - Player* p1 = &players[std::get<0>(*it)]; - Player* p2 = &players[std::get<1>(*it)]; - possible_matches.erase(it); - + for (const auto&m : possible_matches) { + Player* p1 = &players[std::get<0>(m)]; + Player* p2 = &players[std::get<1>(m)]; if (p1->desired_games_ && p2->desired_games_) { result.push_back(std::tuple(p1->id_, p2->id_)); p1->desired_games_--; -- cgit v1.2.3