/*有什么问题或者交流请发邮件或者QQ:787928000 * Created on: 2011-2-27 * Author: banxi1988 * Email:banxi1988@gmail.com * 题目简介: * 005、【问题描述】:某游戏设计中,需要按指定概率自动产生若干个0~100的整数数据。 要求: ① 每个数据需从0~50、51~69、70~89、90~95、95~100这5个分数段中按指定概率自动产生。 ② 各分数段数据的顺序排列是随机均匀分布的,不可以让某一分数段集中出现,产生“扎堆”现象。 ③ 最终产生的数据应完全满足所指定的概率要求。 试编写一段程序,使之能按照上面要求自动产生所需的数据。 【输入】:需要产生的数据个数及指定各分数段数据产生的概率 【输出】:按指定概率随机产生所需的各个数据 【测试样例】: 样例输入1: 数据个数:10 指定0~50、51~69、70~89、90~95、95~100各分数段产生的概率:15,30,35,12,8 样例输出1:86,45,62,100,75,57,92,25,65,78 样例输入2: 数据个数:20 指定0~50、51~69、70~89、90~95、95~100各分数段产生的概率:10,30,30,20,10 样例输出2: 82,65,75,96,58,20,91,88,56,90,92,68,45,98,62,78,72,92,86,65 */ #include<stdio.h> #include<stdlib.h> #include<time.h> #define RANKS 5 typedef struct RANK_ST_TAG{ int start ; int end ; int scope_end ; }RANK_ST; RANK_ST rank[RANKS]; void init_rank_scope(){ rank[0].start = 0; rank[0].end = 50; rank[1].start = 51; rank[1].end = 69; rank[2].start = 70; rank[2].end = 89; rank[3].start = 90; rank[3].end = 95; rank[4].start = 96; rank[4].end = 100; } /*** * 各分数段的概率就当作一个横的坐标的范围。 */ int init_rank_proability(){ int sum_pro = 0,pro; int i = 0; printf("指定0~50、51~69、70~89、90~95、96~100各分数段产生的概率:"); for(i = 0; i < RANKS; i++){ scanf("%d",&pro); if(pro<0||pro>100){ printf("%d 分数段概率输入出错(请输入0到100之前的整数值)/n",(i+1)); return 0; } sum_pro +=pro; rank[i].scope_end = sum_pro; } if(sum_pro != 100){ printf("各分数段的概率之和不为100,请重新输入使之满足100./n"); return 0; } return 1; } /** * 产生指定范围内的随机数。注意srand函数应该在主函数初始化时调用不然后面输出结果中的数都一样。 * 这是伪随机数的特性决定的。 */ int get_rand_number_from_range(int start,int end){ int result = 0; result = rand()%(end-start + 1) + start; return result; } /** * 产生指定分数段中一个随机数。 */ int get_rand_number_from_rank(int index){ return get_rand_number_from_range(rank[index].start,rank[index].end); } /** * 。依赖于init 两个函数的初始化,用到上面get_rand_number函数 * 根据生成的随机数选择分数段。 * 因为算法的设计所以判断感觉比较多,但还是挺自然的。 */ int get_pro_number(){ int rand_n = get_rand_number_from_range(0,100); if(rand_n < (rank[0].scope_end+1)){ return get_rand_number_from_rank(0); }else if(rand_n < (rank[1].scope_end+1)){ return get_rand_number_from_rank(1); }else if(rand_n < (rank[2].scope_end+1)){ return get_rand_number_from_rank(2); }else if(rand_n < (rank[3].scope_end+1)){ return get_rand_number_from_rank(3); }else{ return get_rand_number_from_rank(4); } } int main(int argc,char **argv){ int ret; int count = 0; int i = 0; init_rank_scope(); srand((unsigned)time(NULL)); printf("请输入数据个数:"); scanf("%d",&count); if(count<0){ count = -count; } ret = init_rank_proability(); if( ret == 0){ return EXIT_FAILURE; } printf("输出结果:/n"); for(i = 0; i < count ; i++){ printf("=",get_pro_number()); } putchar('/n'); return EXIT_SUCCESS; } /*** * 测试结果如下: * banxi1988@banxi1988-desktop:~/jeework/match$ ./randGa 请输入数据个数:10 指定0~50、51~69、70~89、90~95、95~100各分数段产生的概率:15 30 35 12 8 输出结果: 61 93 58 61 99 88 75 55 62 95 banxi1988@banxi1988-desktop:~/jeework/match$ ./randGa 请输入数据个数:20 指定0~50、51~69、70~89、90~95、95~100各分数段产生的概率:10 30 30 20 10 输出结果: 92 72 61 96 92 88 91 74 92 78 51 48 93 71 72 66 85 85 54 97 banxi1988@banxi1988-desktop:~/jeework/match$ * */