在C语言中生成不重复的随机数,可以通过以下几种方法实现:
方法一:使用数组存储已生成的随机数
1. 声明一个数组用于存储已生成的随机数。
2. 使用循环生成随机数,并判断该随机数是否已存在于数组中。
3. 若随机数不存在于数组中,则将其添加到数组中;否则重新生成随机数。
4. 重复上述步骤直到生成足够数量的不重复随机数。
方法二:使用洗牌算法(Fisher–Yates)
1. 创建一个数组来存储所有可能的随机数。
2. 使用循环遍历数组,对于每个位置,从剩余未使用的数字中随机选择一个数字,并将其放到当前位置。
3. 重复上述步骤直到所有位置都填满。
方法三:双数组法
1. 创建两个数组,一个用于存储随机数,另一个用于记录随机数是否已经存在。
2. 使用循环生成随机数,并检查该随机数是否已存在于记录数组中。
3. 若随机数不存在于记录数组中,则将其添加到随机数数组中,并在记录数组中标记为已存在。
4. 重复上述步骤直到生成足够数量的不重复随机数。
示例代码
```c
include include include define MAX_NUM 10 // 生成的随机数个数 define MAX_RANGE 100 // 随机数的范围 int main() { int random_nums[MAX_NUM]; // 用于存储随机数的数组 int i, j, num; srand((unsigned) time(NULL)); // 设置随机数种子为当前时间 for (i = 0; i < MAX_NUM; i++) { do { num = rand() % MAX_RANGE + 1; // 生成随机数 for (j = 0; j < i; j++) { if (num == random_nums[j]) { break; // 若随机数已存在于数组中,则重新生成 } } } while (j < i); random_nums[i] = num; // 将生成的随机数添加到数组中 } // 输出生成的不重复随机数 for (i = 0; i < MAX_NUM; i++) { printf("%d ", random_nums[i]); } printf("\n"); return 0; } ``` 建议 种子设置:使用当前时间作为随机数种子,确保每次运行程序时生成的随机数序列不同。 数组大小:确保数组大小足够大,以存储所有可能的随机数,避免数组越界。 性能优化:对于大范围随机数生成,可以考虑使用更高效的算法,如洗牌算法(Fisher–Yates),以降低时间复杂度。