从另一个向量制作随机配对向量

making a random paired vector from another single vector

本文关键字:向量 随机 另一个      更新时间:2023-10-16
    // attender list, PID
    std::vector<DWORD> m_vec_attender{1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119};
    // duel list, PID <> PID
    std::vector <DWORD, DWORD> m_vec_duelList;

我想从另一个向量(DWORD)创建一个随机向量对(DWORD,DWORD)并迭代配对的向量(决斗列表)。在上面的例子中,有 9 个玩家 ID。我想让这 8 名玩家随机配对,并将未配对的玩家留在第一个向量中(用于以后配对;"下一轮"),并从第一个向量中删除这 8 个玩家 ID。据我所知;std::make_pair 并在 C++11 中获取矢量 std::next 中的下一个元素,但我很困惑,似乎有很多方法可以完成这项工作,但我找不到任何与我的问题相关的可靠答案。提前谢谢..

为了解决你的问题,你应该首先创建一个原始向量的副本(如果你仍然需要它)并随机洗牌它:

auto atten_rand = m_vec_attender;
std::shuffle(atten_rand.begin(), atten_rand.end());

随机洗牌后,您现在可以按顺序配对它们。您的目标载体应声明为:

std::vector<std::pair<DWORD, DWORD>> m_vec_duelList;

现在您可以做到:

for (int i = 0; i != 4; ++i) {
    m_vec_duelList.emplace_back(atten_rand[2*i], atten_rand[2*i+1]);
}

请注意,默认情况下,std::shuffle通常使用rand底层进行随机性,这不是一个非常高质量的随机数生成器。这可能适合快速生成平局,但如果您有更高的随机性需求,您应该更详细地调查它。