如何使这个循环指定给向量的一半,而不是整个向量

How can I make this loop assign to half of the vector instead of the entire vector?

本文关键字:向量 一半 循环 何使这      更新时间:2023-10-16

对于我的班级,我正在制作一个管理酒店的程序。我的"测试"方法创建随机房间和随机客户。一旦它做到了这一点,它就会把创建的随机客户带到创建的随机房间中。

我的目标是测试只入住有客户的房间的HALF。让另一半的房间空着。而且,我每个房间只能有一个顾客。

该方法可编译,但存在一些缺陷:

  1. "测试"让所有房间都挤满了顾客(而不是只有一半)
  2. "测试"通常会将一个房间分配给多个客户(例如,301房间现在将属于3个不同的客户,而不是1个)

有人能帮我想出如何只填满一半的房间吗。还可以帮助我弄清楚如何不让一个房间适用于一个以上的客户我很确定方法中的最后一个FOR循环应该是我唯一需要调整的东西

string Hotel::test(int numRooms, int numCustomers)
{
    string result;
    for(int i=0;i<numRooms;i++) // **********CREATES RANDOM ROOMS
    {
        Room iRoom(randString(8),
                   randInt(0,1000),
                   randInt(0,1000),
                   randInt(0,1000),
                   randInt(0,1000));
        listofrooms.add(iRoom);
    }
    for(int i=0;i<numCustomers;i++) // ***********CREATES RANDOM CUSTOMERS
    {
        Customer cus(randString(8),randNumberString(10),randNumberString(16));
        listofcustomers.add(cus);
    }
    for(int i=0;i<numCustomers+numRooms;i++) // **FILLS RANDOM ROOMS WITH RANDOM CUSTOMERS
    {                                        // **I KNOW THIS IS THE ONLY LOOP I NEED TO ADJUST
        checkIn(listofrooms.getRandID(),listofcustomers.getRandID());
    }
    return result;
}

第1部分

你需要一半的房间才能住满。由于任何房间只能有一位客人,因此您需要将房间填满numRooms次。所以,你只需要调整你的循环:

for (int i = 0; i < numRooms/2; i++)

第2部分

有很多方法可以确保这一点天真的方法是在循环中重试

for (int i = 0; i < numRooms/2; i++)
{
    int assignedRoom;
    do
    {
        assignedRoom = listofrooms.getRandID();
    } while (isFull(assignedRoom);
    checkIn(assignedRoom, listofcustomers.getRandID());
}

当然,你不希望同一个客户在两个房间里,所以你也需要对客户做同样的事情。

另一种方法可以是随机抽取一个房间,如果它是满的,则迭代到下一个房间(如果溢出,则循环到第一个房间),直到找到一个空房间。

另一种方法可以是random_shuffle一份房间的副本,并占用前半部分。

就像我说的,无论你对房间做什么,你也需要对顾客做什么。

推荐:也许最后一种方法(使用random_shuffle的方法)可以实现最佳分布。请注意,幼稚方法的性能不确定(可能很差)。

在循环中,结束条件应该是i<numRooms/2,以只填充一半的房间。

每个房间只有一个客户,根据您的限制条件,您有一些选择。你必须记录你已经分配的房间。

例如,您可以从列表中删除已分配的房间——这在大多数情况下可能是不允许的。

或者,你可以修改Room类,使其包含一个布尔值,当它被填充时,你可以设置该布尔值,如果它被填充,你可以寻找另一个房间——再说一遍,你说过除了循环之外,你不想更改任何内容。

您还可以创建一个整数数组,并使用随机选择的值为房间数组(如果您不想多次分配客户,还可以使用另一个数组为客户数组)编制索引,再次删除之前分配的值。

另一种方法是,如果你不需要统一的分配,让一个couner标记需要填充多少个房间才能分配一半,在房间中迭代,对于每个房间,决定是否填充。当剩余的未处理房间数等于要填充的房间数时,请填充所有房间。