7-128 随机产生选择题答案并统计
用户输入一个正整数作为随机种子,根据这个随机种子,产生40个选择题的答案,也就是产生40个随机字母,每个字母是大写字母ABCD中的某一个。提醒:
(1) 务必用srand( )函数进行随机初始化。
(2)你在Windows下的运行结果,和Linux服务器上的运行结果,是不一致的。因此,在本地只管确保程序调试通过,能输出相应格式的信息后,提交代码在服务器上验证。
输入格式:
1到32767之间(含边界)的整数。
输出格式:
40个选择题的答案,及统计数据。
输入样例:
用户输入随机种子322。
322
输出样例:
数字序号用两位数,不足两位前面填充0;数字之后是一个纯英文的点;之后是随机产生的答案,大写字母;再接下来是两个空格。每一组答案信息后都有两个空格,例如下面第一行的“05.A ”之后,也是有两个空格的。
打印5个答案信息后,产生一个换行。
40个答案信息都打印完毕后,打印统计数据。字母后面是纯英文的冒号,然后是保留两位小数的百分比,四组统计数据之间有三组空格,每组空格都是两个空格。01.A 02.C 03.A 04.C 05.A 06.D 07.A 08.B 09.B 10.C 11.C 12.C 13.A 14.D 15.D 16.C 17.C 18.D 19.B 20.C 21.C 22.A 23.A 24.B 25.C 26.A 27.C 28.C 29.C 30.B 31.A 32.D 33.D 34.A 35.B 36.D 37.D 38.B 39.A 40.A A:30.00% B:17.50% C:32.50% D:20.00%
#include <stdio.h>
#include <stdlib.h>
int main() {
int answer[40], A = 0, B = 0, C = 0, D = 0;
unsigned int seed;
scanf("%d", &seed);
srand(seed);
for (int i = 0; i < 40; ++i) {
answer[i] = rand() % 4 + 65;
if(answer[i] == 'A'){
A++;
} else if(answer[i] == 'B'){
B++;
} else if(answer[i] == 'C'){
C++;
} else if(answer[i] == 'D'){
D++;
}
}
for (int i = 0; i < 40; ++i) {
printf("%02d.%c ", i + 1, answer[i]);
if ((i + 1) % 5 == 0) {
printf("\n");
}
}
printf("A:%.2lf%% B:%.2lf%% C:%.2lf%% D:%.2lf%%\n",A/40.0*100,B/40.0*100,C/40.0*100,D/40.0*100);
return 0;
}
知识点补充
- srand函数和rand是什么
void srand(unsigned int seed);
以上是该函数的函数声明,说明了函数需要的参数类型为unsigned intrand函数生成的数字就是根据srand()里的参数来决定的,如果srand的参数seed永远不变,那rand函数生成出来的数字永远都是那么个序列,故rand函数生成的是一个伪随机数,如果想要生成一个相对来说真随机的数字的话,我们可以把srand的参数设置为一个秒数,从1970年1月1日到现在经过的秒数,这个秒数一直在变化,所以也就能达到某种意义上的随机了,但根据这个规则,你也可以推算出在未来的某个时间点上,你能随机出来的数,即你可以预知这个随机生成的数,当然这也仅限c语言的rand函数,一些游戏公司的抽奖算法当然不会这么简单,就拿最简单的把参数设置为1970年1月1日到目前经过的秒数减去多少秒,就没法预测了,如果你也可以生成大量的随机数去和另一个算法的随机数进行对比,总之很困难
思路
- 这道题的难点应该就在随机数上面了吧,有了上面的知识点补充应该能够更好的理解该题
- rand() 返回一随机数值的范围,该范围为0-RAND_MAX,,,RAND_MAX不同平台会有所不同,这题无须在意,只需要了 解有这么个范围即可
- 要取得 [a,b) 的随机整数,使用 (rand() % (b-a))+ a;
要取得 [a,b] 的随机整数,使用 (rand() % (b-a+1))+ a;
要取得 (a,b] 的随机整数,使用 (rand() % (b-a))+ a + 1;
通用公式: a + rand() % n;其中的 a 是起始值,n 是整数的范围。
- 本题的解题是根据A B C D的ASCII码来生成,如果生成了65则表示A,66表示B以此类推
- rand % 4表示的结果一定是0,1,2,3中的一个,加上65说明结果只能是65,66,67,68也就是ABCD
- 生成的数存进数组中,每次存的时候判断该数是A B C D的哪一个,根据对应保存该答案的计数变量进行自增,
也就是说变量A这个数是用来表示答案A的个数,如果要知道数组中一共有多少个A,就统计一共存进去了几次,
每次存进去就让该数 字自增1即可,其他问题可能就在输出格式上了,看一下我的printf即可
题目思路略长,含有两个函数知识点的补充,如有问题欢迎评论区或私信留言