问题描述
从1~20之间随机抽取5个数,分别输出抽取出来的5个数之和和剩余未被抽取的15个数之和。
解决方案
数组标记防重复+rand
int main()
{
int a[20],v[20];
int sum1=0;//被抽数求和
int sum2=0;//未被抽数求和
int t;
for(int i=0;i<20;i++)
{
a[i]=i;//供抽取的20个数
v[i]=0;//标志已被抽取的数
}
srand(time(NULL));//是以当前时间为种子,产生随意数。其中,time(NULL)用来获取当前时间,本质上得到的是一个大整数,然后用这个数来随机数
for(int i=0;i<5;)
{
t=rand()%20; //取随机数。0-19
if(v[t]==0)
{//排除重复的随机数
v[t]=1;
sum1=sum1+t+1;
i++;
}
}
printf("sum1=%d\n",sum1);
for(int i=0;i<20;i++)
{
if(v[i]==0)
sum2=sum2+a[i]+1;
}
printf("sum2=%d",sum2);
system("pause");
return 0;
}
输出结果
总结
题目暗含有不放回抽取的意思,所以要避免重复随机数,故而设置2个数组,一个存储待抽取的数,一个用于标志抽取情况。若只要求求抽取的5个数之和可以不用a[]数组也能实现。