在C语言中生成0-8范围内4个不重复随机数的问题
问题解决步骤
1. 输出显示ASCII码的问题
你用printf("%d\n", winningCode[i]);打印字符数组元素时,%d格式符会将char类型元素按整数(ASCII码值)输出。要显示对应的字符数字,只需把格式符改成%c:
printf("%c\n", winningCode[0]); printf("%c\n", winningCode[1]); printf("%c\n", winningCode[2]); printf("%c\n", winningCode[3]);
2. 生成范围错误(0-7而非0-8)
当前代码rand() % 8生成的是0到7的随机数,不符合你需要的0-8范围,应修改为:
int random_number = rand() % 9;
3. 生成不重复数字的问题
原代码没有去重逻辑,会出现重复数字。可以用一个布尔数组标记已使用的数字,循环生成直到拿到未使用的数值:
else{ srand(time(NULL)); int used[9] = {0}; // 标记0-8是否已被使用,初始全为0(未使用) for(int i = 0 ; i < 4 ; i++ ) { int random_number; do { random_number = rand() % 9; // 生成0-8的随机数 } while(used[random_number]); // 如果已被使用,重新生成 used[random_number] = 1; // 标记为已使用 winningCode[i] = random_number + '0'; // 转成字符 } }
修正后的核心代码片段
int main(int ac, char** av) { char winningCode[5]; if(ac>2 && av[1][0] == '-' && av[1][1]=='c'){ for(int i=0; i<4; i++){ winningCode[i]=av[2][i]; } } else{ srand(time(NULL)); int used[9] = {0}; for(int i = 0 ; i < 4 ; i++ ) { int random_number; do { random_number = rand() % 9; } while(used[random_number]); used[random_number] = 1; winningCode[i] = random_number + '0'; } } winningCode[4]='\0'; // 修改打印格式为%c printf("%c\n", winningCode[0]); printf("%c\n", winningCode[1]); printf("%c\n", winningCode[2]); printf("%c\n", winningCode[3]); printf("%d\n", winningCode[4]); // '\0'的ASCII是0,这部分无需修改 // 后续原代码逻辑保持不变 }
内容的提问来源于stack exchange,提问作者Gerard
相关产品推荐
相关产品推荐

