双色球C语言版
一、要求:产生五个红球,范围1-32,不可重复,并且从小到大排序
产生一个蓝球,范围1-16
输出格式 如:1 2 3 4 5 + 6
二、源码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdbool.h> 4 5 int main(int argc, const char * argv[]) { 6 int redBall[5] = {}; 7 8 //产生不重复的五个红球 9 for (int i = 0; i < 5; i ++) { 10 int temp = arc4random() % 32 + 1;//mac Xcode产生随机数方法 11 12 if (i ==0) { 13 //第一个球直接赋值 14 redBall[0] = temp; 15 } else { 16 //判断是否重复 17 bool isExist = false; 18 19 for (int j = 0; j < i + 1; j ++) { 20 if (temp == redBall[j]) { 21 isExist = true; 22 //重新得到浪费的机会 23 i --; 24 break; 25 26 } 27 28 } 29 30 //无重复,产生红色球 31 if (isExist == false) { 32 redBall[i] = temp; 33 34 } 35 } 36 37 } 38 39 40 //对产生的红球排序,采用选择排序 41 int temp = 0; 42 for (int i = 0; i < 4; i ++) { 43 for (int j = i + 1; j < 5; j ++) { 44 if (redBall[i] > redBall [j]) { 45 temp = redBall[i]; 46 redBall[i] = redBall [j]; 47 redBall[j] = temp; 48 } 49 } 50 51 } 52 53 //产生一个蓝球 54 int blueBall = arc4random () % 16 + 1;55 56 //打印结果 57 for (int i = 0; i < 5; i ++) { 58 printf ("%d ", redBall[i]); 59 } 60 printf ("+ %d\n", blueBall); 61 62 return 0; 63 }
三、运行结果
四、要点
本demo最大难点是产生五个不重复的红球
我之前采用先产生五个球,再判断是否重复,如果重复,再产生五个球,直至产生五个不同的球,类似代码:
while (1){ int a = 0;//控制是否跳出循环 //产生一个随机数数组 for (int i = 0; i < 4; i ++) { ranArr [i] = arc4random() % 9 + 1; } //去掉重复的数字 for (int i = 0; i < 4; i ++) { for (int j = 0; j < 4 && j != i; j ++) { if (ranArr [i] == ranArr [j]) { a = 1; break; } } if ( a == 1){ break; } } if (a == 0) { break; } }
但是明显不是最优。
采用先产生一个数字,再判断是否重复,如果重复,这个数字不要,并且重新得到这次浪费的机会,直到不重复,将该数给球,可以说一点不浪费不重复的数字。