在经历过疫情,上过网课的大家,想必都经历过被点名系统支配的恐惧叭~并且在这一个科技的时代,随机点名出现在课堂上的频率越来越频繁,那这个随机点名是怎么实现的呢?今天我们就简化整个系统,用最简单程序去了解这个程序的工作原理。
预备知识:
随机的产生:
由于是简化这个程序,那么就可以用抽取数字来代替抽取具体的人,在c++程序中也就是说可以生成几个随机数然后每个数字对应到个人,再显示出这个人的姓名。
随机数的产生:
考虑到一般一个班级都是不超过100个人,因此,就以随机生成两位数为例子。这里我们就用rand函数(rand函数是c语言中的函数,是一个用于随机生成数的函数。表达形式为(int rand(viod)),它的返回值是[0,RAND_MAX]间的随机整数,RAND_MAX定义在stdlib.h头文件中,其值为2147483647。注意其头文件要有stdlib.h)。由于rand函数只能生成一个随机数,我们一个班级的人数是固定的,我们就可以用%去取余数(这里我们默认编号是根据人数个数确定的,即有多少个人就有多少个编号且不超过人数个数。)也就是说用rand()%t(t表示总人数)。但是,rand函数只是说生成随机数,再一次进行抽取时,还是上一次抽取的数字,怎么解决呢?这里就要用到srand函数了。srand函数是C语言中的种子函数,用于生成随机数并将其作为接下来的随机数中使用的种子参数。它主要用于生成不完全相同的随机数列。这样就不会有相同的数字产生了。
程序的生成过程(即随机点名程序的最基本原理):
这个程序的主要功能是从指定范围内的学生学号中随机抽取若干个编号,并根据这些编号选择对应的学生进行显示。
1.变量初始化和设置随机种子:
int a[100];
string b[100];
int i = 0, l = 0, m = 0;
int lim;
srand((unsigned)time(NULL));
·a[100]
用于存储被随机抽到的学号编号
·b[100]
用于存储学生姓名。
·i
是循环控制变量。
·l
和 m
分别表示学号范围的最小值和最大值。
·lim
表示要抽取的学生数量。
·srand((unsigned)time(NULL))
设置随机种子,确保每次运行程序时随机结果不同。
2.获取学号范围:
cout << "学生编号取值的最小值是多少?" << endl;
cin >> l;
cout << "学生编号取值的最大值是多少?\n";
cin >> m;
这里,我们可以输入学号的最小值和最大值,分别存储在 l
和 m
变量中。
3.获取要抽取的学生数量:
cout << "请问要选择多少位同学呢?" << endl;
cin >> lim;
4.输入学生姓名:(由于简化,因此可以在这里输入,那么他就会按照顺序依次编号0,1,2,2,3,4,5,6,7,8,9....也可以在最开始初始化的时候就讲姓名输入,例如:b[100]={"张三","李四","王五"...})
cout << "请根据编号顺序输入学生姓名:\n" << endl;
for (i = l; i < m; i++) {
cin >> b[i];
}
用户根据学号顺序输入学生姓名,存储在数组 b
中。
5.随机抽取学号:
cout << "正在为您选择幸运儿,请稍等片刻...\n\n";
Sleep(2000); // 对于整个功能没有实质性作用,只是产生一定的空白时间
for (i = 0; i < lim; i++) {
a[i] = num(l, m);
}
使用 num(int first, int last)
函数在 l
和 m
范围内随机生成学号编号,并存储在数组 a
中。Sleep(3000)
用于产生3秒的延迟。其中sleep函数的运用仅仅是为了增加一点神秘感,让学生被抽取时更加紧张。
6.显示被抽取的学生:
for (i = 0; i < lim; i++) {
cout << b[a[i]] << " 同学,请开始你的表演!\n " << endl;
}
遍历数组 a
,根据随机生成的学号编号,从数组 b
中取出对应的学生姓名并显示。
完整代码呈现:
#include <iostream>
#include <stdlib.h>
#include <ctime>
#include <windows.h>
using namespace std;
//一个用于随机产生合理的编号的函数
int num(int first, int last)
{
int dif = last - first;
return rand() % dif + first;
}
int main()
{
int a[100];
string b[100];
int i = 0, l = 0, m = 0;
int lim;
srand((unsigned)time(NULL));
//选取被抽调编号的范围
cout << "学生编号取值的最小值是多少?" << endl;
cin >> l;
cout << "学生编号取值的最大值是多少?\n";
cin >> m;
//确定要抽取的同学的数量
cout << "请问要选择多少位同学呢?" << endl;
cin >> lim;
cout << "请根据编号顺序输入学生姓名:\n"<<endl;
for (i=l; i< m ; i++)
{
cin >> b[i];
}
//开始抽调同学
cout << "正在为您选择幸运儿,请稍等片刻...\n\n";
Sleep(3000);//对于整个功能没有实质性作用,只是产生一定的空白时间
for (i = 0; i < lim; i++)
{
a[i] = num(l, m);
}
//显示被抽到的同学
for (i = 0; i < lim; i++)
{
cout << b[a[i]] << " 同学,请开始你的表演!\n " << endl;
}
return 0;
}