如何在类构造函数中生成一个设置范围内的随机整数(没有重复!)? 我从一本教科书中自学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++;