1、点名器
点名器在生活中是一种普遍常见的随机数的应用。点名器包含着一种数学领域中一种很重要的思想——随机思想。随机在数学领域上有一个很高的地位。
2、随机思想在C++上的表达
C++具有随机函数rand(),而在指令编辑器中,一般都会设置“随机种子”,所以C++还有随机种子srand()。
设置随机种子的格式为srand(time(0));。
rand() 和 srand() 均需添加头文件 #include<cstdlib>,而 time(0) 需要添加头文件 #include<ctime>。
通常,表示由x到y的随机数,用 x+rand()%(y-x+1) 表示(注意:x小于y)。
//例子
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
int x,y,a;
srand(time(0));
cin >> x >> y;
a = x + rand() % (y - x + 1); //a赋值为x到y的随机整数
cout << a;
return 0;
}
3、点名器的制作
1、分析
首先,群体的人数并不是一成不变的。因此,我们要让点名器“适应”人数。由此,我们可以定义一个变量num。
int num;
其次,我们还需要一个变量,保存生成的随机数。因此可以定义一个变量random。
int random;
此时,我们要让点名器生成一个1到num的整数。通过上面的说明,可知应先设置随机种子,再进行随机数的生成。
srand(time(0));
random = 1 + rand() % num;
2、组合与添加
接下来,就是将我们上部分的代码段组合起来了。
int num, random;
srand(time(0));
random = 1 + rand() % num;
虽然代码段组合了,但是此时我们无法输入人数,也无法知道random的值。所以此时,我们要使用格式化函数输入人数num、输出random。
格式化输入函数是scanf(),格式化输出是printf(),使用时需添加头文件 #include<cstdio>。
int num, random;
srand(time(0));
scanf("%d",&num);
random = 1 + rand() % num;
printf("%d\n",random);
3、修改与简化
最后,我们就要将整个代码完整地打出来了。我们需要将头文件、命名空间、主函数添加上去。
#include<cstdlib>
#include<ctime>
#include<cstdio>
using namespace std;
int main()
{
int num,random;
srand(time(0));
scanf("%d",&num);
random = 1 + rand() % num ;
printf("%d\n",random);
return 0;
}
仔细观察,发现random其实是一个多余的变量。我们只需将随机值转移到格式化输出即可。
#include<cstdlib>
#include<ctime>
#include<cstdio>
using namespace std;
int main()
{
int num;
srand(time(0));
scanf("%d",&num);
printf("%d\n",1 + rand() % num);
return 0;
}
运行一下,点名器就可以使用了。
4、功能的完善
我们也可以对程序添加一些语言,使输入和输出不那么枯燥。
#include<cstdlib>
#include<ctime>
#include<cstdio>
using namespace std;
int main()
{
int num;
srand(time(0));
printf("请输入人数:");
scanf("%d",&num);
printf("被点到的是%d号。\n",1 + rand() % num);
return 0;
}
当然,点名器一般都不仅仅使用一次。这时,我们可以使用一个while循环,造成无限循环的结构,并利用 if 判断语句以0表示结束。
while循环与 if 判断的格式是:
while(循环条件)
{
循环语句(组);
}
if(成立条件)
{
语句(组);
}
结束循环节时,要使用 break; 函数。
如此,我们可以得到:
#include<cstdlib>
#include<ctime>
#include<cstdio>
using namespace std;
int main()
{
int num;
srand(time(0));
while(true)
{
printf("请输入人数:");
scanf("%d",&num);
if(num==0) //此处==是关系运算符,不是赋值号
{
break;
}
printf("被点到的是%d号。\n",1 + rand() % num);
}
return 0;
}
当然,错误是不可避免的。我们还可以添加一个容错机制,提醒用户输入无效,并让用户重新输入。
#include<cstdlib>
#include<ctime>
#include<cstdio>
using namespace std;
int main()
{
int num;
srand(time(0));
while(true)
{
printf("请输入人数:");
scanf("%d",&num);
while(num<0) //注意:0是用于退出的,是有意义的,容错机制中不能包含0
{
printf("您输入的人数无效,请重新输入:");
scanf("%d",&num);
}
if(num==0)
{
break;
}
printf("被点到的是%d号。\n",1 + rand() % num);
}
return 0;
}
这样,点名器也就制作完成了。