0 0

一个小例子,关于随机排序

ikunkun 4月前 187

本文共计2834个字,预计阅读时长11.3分钟。

朋友让做一个 排序器,具体 逻辑是 总计60个人 ,前20人为队长,分别为20个队伍,后40个人随机分配到队伍中,每个队伍为3人

这是具体例子:

#include <iostream>
#include <fstream>
#include <vector>
#include <random>
#include <string>
void 开始摇号()
{
    const int numTeams = 20; // 队伍数量
    const int membersPerTeam = 3; // 每个队伍的成员数量,包括队长
    std::string filename = "name.txt"; // 名字文件的路径

    std::vector<std::string> names; // 存储所有名字
    std::vector<std::string> captains; // 存储队长的名字
    std::vector<std::vector<std::string>> teams(numTeams, std::vector<std::string>(membersPerTeam)); // 存储每个队伍的成员

    // 尝试打开文件
    std::ifstream file(filename);
    if (!file.is_open())
    {
        std::cerr << "无法打开文件: " << filename << std::endl;

    }

    std::string name;
    while (getline(file, name))
    {
        if (!name.empty())
        { // 确保跳过空行
            names.push_back(name);
        }
    }
    file.close();

    // 打印读取的名字数量,用于调试
    std::cout << "读取的名字数量: " << names.size() << std::endl;

    // 检查名字数量是否足够
    if (names.size() < numTeams)
    {
        std::cerr << "Error: 文件中的名字数量不足。" << std::endl;

    }

    // 分配队长
    for (int i = 0; i < numTeams; ++i)
    {
        captains.push_back(names[i]);
    }

    // 剩余的名字作为队员
    std::vector<std::string> members;
    for (size_t i = numTeams; i < names.size(); ++i)
    {
        members.push_back(names[i]);
    }

    // 初始化随机数生成器
    std::random_device rd;
    std::mt19937 g(rd());
    std::shuffle(members.begin(), members.end(), g); // 打乱队员顺序

    // 为每个队伍分配队员
    for (int i = 0; i < numTeams; ++i)
    {
        teams[i][0] = captains[i]; // 第0位是队长
        teams[i][1] = members[i * 2]; // 第1位是第一个队员
        if (i * 2 + 1 < members.size())
        { // 检查是否有足够的队员
            teams[i][2] = members[i * 2 + 1]; // 第2位是第二个队员
        }
        else
        {
            std::cerr << "Error: 不能为所有队伍分配足够的队员。" << std::endl;

        }
    }

    // 打印结果
    for (int i = 0; i < numTeams; ++i)
    {
        std::cout << "队伍 " << i + 1 << ":";
        for (int j = 0; j < membersPerTeam; ++j)
        {
            std::cout << " " << teams[i][j];
        }
        std::cout << std::endl;
    }
}
int main()
{
    bool running = true;
    char userChoice;
    while (running)
    {
        std::cout << "请输入 '1' 以开始摇号: ";
        std::cin >> userChoice;

        if (userChoice == '1')
        {
            开始摇号();
        }
        else
        {
            std::cout << "输入无效,请重新输入。" << std::endl;
        }
    }
    return 0;
}

几个小知识点:

1.用到读取文件,为了方便编辑队员的名字,所以用了读取txt

2.随机数生成器

3.txt用ansi码,这样中文系统下可以读取到正确字符

最后于 3月前 被ikunkun编辑 ,原因:
最新回复 ( 0 )
© 2024 - now
小黑屋 | 自豪地采用Xiuno BBS丨网站由Ado大力赞助