如何在循环中检查随机值重复并返回值?求生成不重复随机值的C函数
生成无重复随机值并存储到数组的C语言实现
核心实现思路
要生成不重复的随机值并存储到数组,核心步骤是:
- 每次生成随机值后,检查该值是否已经存在于数组已填充的元素中
- 如果重复则重新生成,直到得到一个未出现过的值
- 随机种子只需初始化一次,避免短时间内多次调用导致随机序列重复
- 遵循C语言数组从0开始索引的规范,充分利用数组空间
原代码的问题分析
你提供的代码存在几个关键问题:
- 数组从索引1开始遍历,浪费了
arr[0]的空间,不符合C语言的使用习惯 - 存在语法错误:
session = arr[i] for (...)是非法的语句写法 - 循环内部直接
return session会导致函数仅返回第一个生成的值就退出,无法完成整个数组的填充 srand(time(0))放在函数内,若短时间多次调用函数,会因time(0)返回相同秒数导致生成的随机值重复- 重复检查逻辑有误:发现重复时仅将
i--,但未重新生成随机值,会导致arr[i]的值未更新
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> // 生成count个无重复随机值存入传入的arr数组 void generate_unique_randoms(int *arr, int count) { if (arr == NULL || count <= 0) { return; } // 确保随机种子只初始化一次 static int seed_initialized = 0; if (!seed_initialized) { srand(time(0)); seed_initialized = 1; } for (int i = 0; i < count; i++) { int random_val; int is_duplicate; do { is_duplicate = 0; random_val = rand(); // 检查当前随机值是否已存在于数组中 for (int j = 0; j < i; j++) { if (arr[j] == random_val) { is_duplicate = 1; break; } } } while (is_duplicate); // 重复则重新生成 arr[i] = random_val; } } // 示例调用 int main() { const int size = 80; int arr[size]; generate_unique_randoms(arr, size); // 打印生成的所有无重复随机值 for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } return 0; }
关键细节说明
- 随机种子初始化:用
static变量seed_initialized确保rand()的种子只在第一次调用函数时初始化,避免短时间多次调用导致随机序列重复 - 重复检查逻辑:通过
do-while循环持续生成随机值,直到得到一个未在数组中出现过的值 - 参数设计:让调用者传入数组,避免返回局部栈数组导致的野指针问题,同时提升函数的灵活性
- 健壮性处理:增加对传入数组指针和计数的合法性检查,避免非法输入导致程序崩溃
内容的提问来源于stack exchange,提问作者rose
相关产品推荐
相关产品推荐

