7-128 随机产生选择题答案并统计

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 int

rand函数生成的数字就是根据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即可

题目思路略长,含有两个函数知识点的补充,如有问题欢迎评论区或私信留言

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Likf(❁´◡`❁)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值