【问题标题】:Randomizing one patient per bed using vectors使用向量随机化每张床位一名患者
【发布时间】:2013-08-01 16:14:26
【问题描述】:

我对向量很陌生。我有一个项目分配,我随机分配病人到病床。我需要做到这一点,这样我每张床只能有一个病人。我的问题是如何让一名患者被随机分类并分配到一张床位?

这是一个大小适中的程序,代码位于多个文件中,请多多包涵。如果您有不明白的地方,请告诉我,我会尽力解决它。

这是我在一张床位上只分配一名患者。这个功能很可能是我的问题。

string Hospital::assignRandPatientToBed()
{
    for(int i=0;i<2;i++)
    {
        for(unsigned int pi=0;pi<vBeds.size();pi++)
        {
            if(rand()%2)
            {
                 //bigRand is a function: numberToString=9      
                 vPatients[bigRand()%vPatients.size()].bedId;   ///MORE THAN  LIKELY WRONG
            }
        }
    }
    return "Random Beds assigned to Patients.\n";
}

我的主要课程的私人部分,hospital.h

private:
    int nextPatientIDtoBeUsed;
    vector<Patient> vPatients;
    map<int,int> PatientIDIndex;
    map<string,int>PatientNameIndex;
    map<string,int>PatientCategoryIndex;

    int nextDoctorIDtoBeUsed;
    vector<Doctor> vDoctors;
    map<int,int> DoctorIDIndex;

    int nextBedIDtoBeUsed;
    vector<Bed> vBeds;
    map<int, int> BedIDIndex;
};

Bed.h 的头文件

class Bed 
{
   friend class Hospital;

   public:

   private:
   int id;
   string location;
   string bedType;
   int patientID;
};

patient.h 的头文件部分(我只为此目的使用私有部分,它是一个大头文件)。

private:
    int id;
    vector<int> doctorIDs;
    int bedId;
};

我必须修复的输出。床位由500分配,病人是8927号码。

     500 CDDIUTEIOJ
            892795431 Muw, Eziel (174) 094-8824
            892795431 Muw, Eziel (174) 094-8824
            892795431 Muw, Eziel (174) 094-8824
            892795431 Muw, Eziel (174) 094-8824
            892795431 Muw, Eziel (174) 094-8824
     501 CMPSAJLFVG
            892795431 Muw, Eziel (174) 094-8824
            892795431 Muw, Eziel (174) 094-8824
            892795431 Muw, Eziel (174) 094-8824
            892795431 Muw, Eziel (174) 094-8824
            892795431 Muw, Eziel (174) 094-8824

它使用随机创建的名字并将其分配给床。对于输出,我选择将 5 个患者添加到 5 张病床,但我在 2 之后将其切断,因为它只是重复了 5 次。

【问题讨论】:

    标签: c++ vector


    【解决方案1】:

    想法:

    vBeds 向量开始,使用c++ stl 中的random_shuffle function template 以随机顺序遍历床。一旦你有一个新的病人要分配,你就可以进行下一次迭代并使用这张床。您将希望通过维护明确的免费床位列表fbl 将床位列表返回到可用床位池中。

    断言将是迭代器中与fbl 连接的剩余元素等效于所有可用床的池。如果您已到达迭代器的末尾,则在 fbl 上重新创建它,然后将 fbl 设置为一个新的空列表。

    【讨论】:

      【解决方案2】:

      您还可以对 beds 而不是 patients 应用随机排列。然后,您可以按患者到达的顺序分配患者,并将他们映射到随机床位。由于您的bed 类包含id 属性,因此您不会通过这种方法丢失任何信息。

      有关如何执行此操作的示例,请参阅 the random shuffle algorithm

      【讨论】:

      • 谢谢你。我会阅读并尝试使其相关。
      【解决方案3】:

      “将向量 V 的项随机分配到容器 C 中的槽”时的一般原则是这样的:

      1. 在R中选择0..C.size()-1范围内的随机数
      2. 检查插槽 C[R] 是否可用。如果没有重复步骤 1。
      3. 在 V 中选择下一个可用项目,然后插入 C[R]。
      4. 如果没有完成所有 V,请返回 1。

      【讨论】:

      • 好的,所以我缺少一个检查插槽是否可用的功能?
      • 或“未使用”或类似的东西,是的。当然,collapser 建议的随机洗牌是解决相同问题的另一种方法。虽然这假设您不需要在向量中按特定顺序排列床。
      • OO 好的,我希望按数字顺序排列床位,但随机添加了患者。为什么 .push_back() 不适用于床?我们将它用于分配给患者的医生,但它不适用于床位。
      • vDoctors[DoctorIDIndex[drID]].patientIDs.push_back(patID); 患者 ID;在 patient.h 中你有 int id;矢量医生ID;我注意到 bed.h 没有向量。
      • 不,它只是一个int,所以当床是空的时它有一些“未使用”的值,而当它在使用时,它作为病人的 id - 因为您不希望每张床有超过一名患者,您不需要向量,因此无需使用 push_back,只需将患者的 id 分配给床的病床的患者 ID。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 2023-04-02
      • 1970-01-01
      • 2022-10-20
      • 1970-01-01
      相关资源
      最近更新 更多