点名器——随机数的应用

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;
}

这样,点名器也就制作完成了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值