如何在类构造函数中生成一个设置范围内的随机整数(没有重复!)? 我从一本教科书中自学C++,我有一个问题要解决,下面概述。

如何在类构造函数中生成一个设置范围内的随机整数(没有重复!)? 我从一本教科书中自学C++,我有一个问题要解决,下面概述。,c++,class,random,constructor,C++,Class,Random,Constructor,我的班级结构如下: #include <iostream> #include <cstdio> #include <ctime> using namespace std; class classroom{ char name[25]; int student_id; float grades[10]; float average; int num_tests; float le

我的班级结构如下:

 #include <iostream>
 #include <cstdio>
 #include <ctime> 

 using namespace std;


   class classroom{

     char name[25];
     int student_id;
     float grades[10];
     float average;
     int num_tests;
     float letter_grade;

   public:       
     void enter_name_id(void);
     void enter_grade(void);
     void average_grades(void);
     void letter_grades(void);
     void output_name_id_grade(void);
     classroom();

   };
我需要为构造函数中的每个学生生成一个值范围内的唯一学生ID,例如0到10

我已将以下代码片段复制到构造函数中。它在所需范围内为我生成随机数:

srand((unsigned)time(0));
  int random_integer=0; 
  random_integer = (rand()%5) + (rand()%5);

问题是,我需要消除生成的随机数范围内的任何重复项。

只需有一个包含所有可能学生ID的向量即可。在你的例子中是0..Range

做一个测试,选择前三个ID并分配它们

我添加了一个有效的解决方案

//Only have one instance of this class.
class IdMgr
{
    std::vector<int> mIds;
    int mCurrentId;
public:
    IdMgr( int Max )
    {
        for ( int i = 0 ; i <= Max; ++i )
            mIds.push_back( i );

        std::random_shuffle( mIds.begin() , mIds.end() );

        mCurrentId = 0;
    }

    //Call this function from your class constructor
    int GetNextId()
    {
        return mIds[ mCurrentId++];
    }
};
//此类只有一个实例。
班级经理
{
std::向量mIds;
国际货币基金组织;
公众:
IdMgr(内部最大值)
{

对于(inti=0;i,只需要一个包含所有可能学生ID的向量。在您的例子中为0..Range

做一个测试,选择前三个ID并分配它们

我添加了一个有效的解决方案

//Only have one instance of this class.
class IdMgr
{
    std::vector<int> mIds;
    int mCurrentId;
public:
    IdMgr( int Max )
    {
        for ( int i = 0 ; i <= Max; ++i )
            mIds.push_back( i );

        std::random_shuffle( mIds.begin() , mIds.end() );

        mCurrentId = 0;
    }

    //Call this function from your class constructor
    int GetNextId()
    {
        return mIds[ mCurrentId++];
    }
};
//此类只有一个实例。
班级经理
{
std::向量mIds;
国际货币基金组织;
公众:
IdMgr(内部最大值)
{

对于(int i=0;i一种方法是使用所谓的静态成员变量。通常,每个对象都有自己的成员变量副本。在您的代码中,每个学生都有自己的
名称副本[25]
学生id
,等等。但您想要的是在类的每个实例之间共享的内容(学生[3]
教室中的每个元素都是类的实例)

下面是一些注释。请注意,它们为一个非常类似的问题提供了一个解决方案——它们为每个类实例分配了唯一的ID。它们在这里提供的内容与您要求的内容之间的唯一区别是,您要求它是随机化的,而不是连续的

因此,您不希望静态成员变量跟踪一个数字(最后一个分配的数字),而是希望静态成员变量跟踪以前分配的所有ID。std.vector或简单int数组应该可以工作


#包括
#包括
#包括
#包括
#包括
使用名称空间std;
课堂{
字符名[25];
国际学生证;
浮动等级[10];
浮动平均;
int-num_检验;
浮点数字母_级;
使用静态向量;
公众:
作废输入\名称\标识(作废);
无效输入等级(无效);
空隙率平均值(空隙率);
无效字母_等级(无效);
作废输出\名称\标识\等级(作废);
教室();
};
向量教室::used=vector();
教室:教室{
int i;
int random_integer=0;
布尔兰多克;
做
{
//生成随机整数
随机整=(rand()%5)+(rand()%5);

//cout一种方法是使用所谓的静态成员变量。通常,每个对象都有自己的成员变量副本。在代码中,每个学生都有自己的
名称副本[25]
学生id
,等等。但您想要的是在类的每个实例之间共享的内容(学生[3]
教室中的每个元素都是类的实例)

下面是一些注释。请注意,它们为一个非常类似的问题提供了一个解决方案——它们为每个类实例分配了唯一的ID。它们在这里提供的内容与您要求的内容之间的唯一区别是,您要求它是随机化的,而不是连续的

因此,您不希望静态成员变量跟踪一个数字(最后一个分配的数字),而是希望静态成员变量跟踪以前分配的所有ID。std.vector或简单int数组应该可以工作


#包括
#包括
#包括
#包括
#包括
使用名称空间std;
课堂{
字符名[25];
国际学生证;
浮动等级[10];
浮动平均;
int-num_检验;
浮点数字母_级;
使用静态向量;
公众:
作废输入\名称\标识(作废);
无效输入等级(无效);
空隙率平均值(空隙率);
无效字母_等级(无效);
作废输出\名称\标识\等级(作废);
教室();
};
向量教室::used=vector();
教室:教室{
int i;
int random_integer=0;
布尔兰多克;
做
{
//生成随机整数
随机整=(rand()%5)+(rand()%5);

//为什么数字必须是随机的?你不能只使用一个静态int,每次你需要生成一个新的学生号时它都会递增吗?

为什么数字必须是随机的?你不能只使用一个静态int,每次你需要生成一个新的学生号时它都会递增吗?

对于所有想知道的人来说为类的每个实例创建唯一id的问题的解决方案如下:

class classroom{

         char name[25];
         int student_id;
         float grades[10];
         float average;
         int num_tests;
         float letter_grade;

         **static int next_student_id;**

  public:       
         void enter_name_id(void);
         void enter_grade(void);
         void average_grades(void);
         void letter_grades(void);
         void output_name_id_grade(void);
         classroom();
  };

         **int classroom::next_student_id=1;**
请注意,新成员:static int next_student_id已创建并在构造函数中使用,它也已在类结构之外初始化

在构造函数中,我只使用了以下代码:

student_id=next_student_id++;
该代码为班级结构的每个实例生成唯一的连续数字; 请注意,我知道班级教室不是一个理想的名称,因为它与班级名称冲突,但我在抄袭教科书问题的基本命名时使用了这个名称

我得出的结论是,艾伦的回答对我帮助最大,也为我提供了最简单的解决方案。因此,艾伦得到了我的支持

我也要感谢Jedwards,如果你的回答是继续的话,也可以是一个替代的解决方案……但事实证明,使用静态int是关键,生成随机数和创建向量是不必要的

谢谢

class classroom{

         char name[25];
         int student_id;
         float grades[10];
         float average;
         int num_tests;
         float letter_grade;

         **static int next_student_id;**

  public:       
         void enter_name_id(void);
         void enter_grade(void);
         void average_grades(void);
         void letter_grades(void);
         void output_name_id_grade(void);
         classroom();
  };

         **int classroom::next_student_id=1;**
student_id=next_student_id++;