C++ 尝试将向量中的两个项配对,但仅使用一次

C++ 尝试将向量中的两个项配对,但仅使用一次,c++,arrays,vector,random,C++,Arrays,Vector,Random,我不确定我的标题是如何描述的,但希望一些点击,将更好地理解我在这里的意思 我正在制作一个简单的游戏,我想要创建的函数应该从数组(名称)和另一个数组(角色)中获取一个项目,并将它们配对,形成“名称角色”,将添加到另一个向量中 我的第一个版本让我尝试使用rand(),所有数字都在13以下,但我发现自己必须在前6项之后等待大约30分钟,因为很明显,它需要一段时间才能得到另一个尚未使用的索引。我试着用一些向量来表示项目,从中提取随机数,然后删除那个数,这样速度会快得多,但它陷入了一个循环,我不知道为什么

我不确定我的标题是如何描述的,但希望一些点击,将更好地理解我在这里的意思

我正在制作一个简单的游戏,我想要创建的函数应该从数组(名称)和另一个数组(角色)中获取一个项目,并将它们配对,形成“名称角色”,将添加到另一个向量中

我的第一个版本让我尝试使用rand(),所有数字都在13以下,但我发现自己必须在前6项之后等待大约30分钟,因为很明显,它需要一段时间才能得到另一个尚未使用的索引。我试着用一些向量来表示项目,从中提取随机数,然后删除那个数,这样速度会快得多,但它陷入了一个循环,我不知道为什么。我为此工作了很长一段时间,开始对自己的代码感到非常困惑和疲惫,所以如果有人能帮助我,那就太好了

我当前的非工作代码:

std::vector<std::string> gGetResidents()
{
    std::string gPlayers[12]{ "Deodat Lawson", "James Bayley", "Edward Bishop", "Rebecca Nurse", "Sarah Good",
    "Bridget Bishop", "Sarah Wildes", "Elizabeth Howe", "John Proctor", "Martha Carrier", "George Burroughs",
    "Giles Corey" };

    std::string gRoles[12]{ "Jailor", "Sheriff", "Investigator", "Vigilante", "Doctor", "Bodyguard", "Lookout",
    "Escort", "Godfather", "Mafioso", "Consort", "Framer" };

    std::vector<size_t> gUsed;

    std::vector<std::string> gMetaResidents;

    for (size_t gInd{ 0 }; gInd < 12; ++gInd)
    {
    gLabel:

        std::vector<size_t> gNumbersPlayer{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

        std::vector<size_t> gNumbersRole{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

        srand(time(nullptr));
        size_t gRandomPositionPlayer = rand() % gNumbersPlayer.size();
        size_t gRandomPositionRole = rand() % gNumbersRole.size();

        std::cout << "siz : " << gNumbersPlayer.size() << "\n\n";

        std::cout << "rand pos pl : " << gRandomPositionPlayer << " rand pos rol : " << gRandomPositionRole << "\n\n";

        size_t gRandomPlayer{ 0 };
        size_t gRandomRole{ 0 };

        if(gRandomPositionPlayer < gNumbersPlayer.size() && std::find(gNumbersPlayer.begin(), gNumbersPlayer.end(), gRandomPositionPlayer) != gNumbersPlayer.end())
        {
            gRandomPlayer = gNumbersPlayer[gRandomPositionPlayer -1];
            gNumbersPlayer.erase(gNumbersPlayer.begin() + gRandomPositionPlayer);
        }

        std::cout << "rand pl : " << gRandomPlayer;

        if (gRandomPositionRole < gNumbersRole.size() && std::find(gNumbersRole.begin(), gNumbersRole.end(), gRandomPositionRole) != gNumbersRole.end())
        {
            gRandomRole = gNumbersRole[gRandomPositionRole - 1];
            gNumbersRole.erase(gNumbersRole.begin() + gRandomPositionRole);
        }

        std::cout << " rand rol : " << gRandomRole << "\n\n";

        if (std::find(gUsed.begin(), gUsed.end(), gRandomPlayer) != gUsed.end())
            goto gLabel;

        if (std::find(gUsed.begin(), gUsed.end(), gRandomRole) != gUsed.end())
            goto gLabel;

        gUsed.push_back(gRandomPlayer);
        gUsed.push_back(gRandomRole);

        std::string gCombinedUn = gPlayers[gRandomPlayer].append(" is the ");
        std::string gCombined = gCombinedUn.append(gRoles[gRandomRole]);

        gMetaResidents.push_back(gCombined);

        gCombinedUn.clear();
        gCombined.clear();

        std::cout << gRandomPlayer << " - " << gRandomRole << "\n";
    }

    return gMetaResidents;
}
std::vector gGetResidents()
{
std::string gPlayers[12]{“Deodat Lawson”、“James Bayley”、“Edward Bishop”、“Rebecca Nurse”、“Sarah Good”,
“Bridget Bishop”、“Sarah Wildes”、“Elizabeth Howe”、“John Proctor”、“Martha Carrier”、“George Burroughs”,
“贾尔斯·科里”};
string gRoles[12]{“狱卒”、“治安官”、“调查员”、“治安警员”、“医生”、“保镖”、“了望员”,
“护卫队”、“教父”、“黑手党”、“配偶”、“制宪者”};
std::矢量喷涌;
std::向量gmetresidents;
对于(大小\u t gInd{0};gInd<12;++gInd)
{
格拉贝尔:
向量gNumbersPlayer{1,2,3,4,5,6,7,8,9,10,11,12};
向量gNumbersRole{1,2,3,4,5,6,7,8,9,10,11,12};
srand(时间(nullptr));
size\u t gRandomPositionPlayer=rand()%gNumbersPlayer.size();
size\u t gRandomPositionRole=rand()%gNumbersRole.size();

std::cout首先,不要在循环中调用
srand
。它会在每次迭代中重置种子。在程序开始时执行一次。至于你的问题,如果你想要一组唯一的数字,你可以得到一些帮助来存储你的随机值。然后你可以轻松地循环获取随机值,直到得到一个不是唯一的值最后,使用
goto
通常是不被鼓励的。特别是当有其他语言结构可以替代时。比如a。我将尝试你提到的前两件事,但关于goto,我知道人们怎么说,但我不能在我的示例中使用continue。我可以,但它会变得更混乱,所以我宁愿使用jus别留着它,我想这没什么大不了的。谢谢你,老兄,我会试试你说的,然后来的back@ShaggyDoo--你的例子就是
goto
的一个糟糕用法。你正在向上分支到一个标签,这比向下分支到一个标签要糟糕得多。你应该用
do..while()
。首先,不要在循环中调用
srand
。它会在每次迭代中重置种子。在程序开始时执行一次。至于你的问题,如果你想要一组唯一的数字,你可以在存储随机值方面得到一些帮助。然后你可以轻松地循环获取随机值,直到得到一个不在循环中的值集合。最后,使用
goto
通常是不被鼓励的。特别是当有其他语言结构可以替代时。比如a。我将尝试你提到的前两件事,但是关于goto,我知道人们怎么说,但我不能在我的示例中使用continue。我可以,但它会变得更混乱,所以我宁愿留着吧,我想这没什么大不了的。谢谢你,老兄,我会试试你说的然后来的back@ShaggyDoo--你的例子就是
goto
的一个不好的用法。你向上分支到一个标签,这比向下分支到一个标签要糟糕得多。你应该用
do..while()
来代替它。