如何在定义rand随机数组的头文件中完成srand随机数播种
实现方案说明
C语言中全局/静态变量的初始化操作会在main函数执行前完成,你原写法中直接用rand()初始化全局数组的操作,执行时机早于main内的srand调用,自然无法得到符合预期的随机结果。
如果要在头文件中完成播种+数组初始化,可以借助静态变量初始化的副作用实现,参考代码如下:
// 头文件内容,注意添加头文件保护防止重复引入 #ifndef RAND_ARRAY_H #define RAND_ARRAY_H #include <stdlib.h> #include <time.h> static int init_rand() { // 播种逻辑在静态变量初始化时触发,早于数组的rand调用 srand(time(0)); return 0; } // 定义静态变量触发初始化函数执行,保证rand调用前已经完成播种 static int __rand_seed = init_rand(); int itemA[3] = {rand() % 20 + 1, rand() % 20 + 1, rand() % 20 + 1}; #endif
注意事项
- 上述写法仅适用于该头文件仅被一个
.c文件引入的场景,如果需要多文件共用该数组,需要将数组声明为extern,播种逻辑和数组定义放到单独的.c文件中,头文件仅保留数组的外部声明,避免出现重复定义、srand被多次调用的问题。 - 你当前的写法无法保证三个随机数不重复,如果需要生成不重复的随机值,可以将数组赋值逻辑整合到初始化函数中:
// 去重版本实现 #ifndef RAND_ARRAY_H #define RAND_ARRAY_H #include <stdlib.h> #include <time.h> int itemA[3]; static int init_rand() { srand(time(0)); int val_flag[20] = {0}; for (int i = 0; i < 3; i++) { int cur_val; do { cur_val = rand() % 20 + 1; } while (val_flag[cur_val - 1]); val_flag[cur_val - 1] = 1; itemA[i] = cur_val; } return 0; } static int __rand_seed = init_rand(); #endif
内容的提问来源于stack exchange,提问作者Kyle Luster
相关产品推荐
相关产品推荐

