对于我的班级,我正在编写一个管理酒店的程序。我的“测试”方法会创建随机的房间和随机的客户。完成此操作后,它将接收创建的随机客户,并将其检入创建的随机房间。

我的目标是让测试仅向客户检入一半的房间。并将另一半房间留空。而且,我每个房间只能有1位客户。

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


“测试”将所有房间(而不是其中只有一半)填满客户。
“测试”通常会将一个房间分配给多个客户(例如,房间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部分

您需要将一半的​​房间填满。由于任何房间只能有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的方法)可以获得最佳的分布。请注意,幼稚的方法具有不确定性(并且可能很差)。

关于c++ - 如何使此循环分配给 vector 的一半而不是整个 vector ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9831879/

10-11 22:23