C语言循环中每次生成的随机值均相同,求解决方法
循环中生成重复随机值的问题解决
问题根源
你的代码中,每次调用random_number函数时都会执行srand(time(NULL))重新初始化随机数生成器。由于循环迭代速度极快,time(NULL)返回的秒级时间戳在多次调用中完全相同,导致随机数生成器的种子重复,最终每次生成的随机值都一致。
解决方案
随机数生成器的种子只需要在程序启动时初始化一次,不需要在每次生成随机数时重复初始化。
修改后的代码
main.c
#include <stdio.h> #include <time.h> #include "./random.h" #define numberOfLoops 4 int main() { const char *messages[] = { "Hello!", "How?", "Good!"}; // 仅在程序开始时初始化一次随机数种子 srand(time(NULL)); for (int i = 0; i < numberOfLoops; i++) { int random_value = random_number(0, sizeof(messages) / sizeof(messages[0]) - 1); printf("\n%d", random_value); printf("\n%s", messages[random_value]); } return 0; }
random.h
#include <stdio.h> #include <time.h> #include <stdlib.h> int random_number(int min_num, int max_num); int random_number(int min_num, int max_num) { int result = 0, low_num = 0, hi_num = 0; if (min_num < max_num) { low_num = min_num; hi_num = max_num + 1; // 包含max_num在输出范围内 } else { low_num = max_num + 1; // 包含max_num在输出范围内 hi_num = min_num; } // 移除重复的srand调用 result = (rand() % (hi_num - low_num)) + low_num; return result; }
额外说明
- 标准C规范中,
main函数的返回类型必须是int,且需要返回一个状态值(如return 0;表示程序正常结束),void main属于非标准写法,建议修正。 rand()生成的是伪随机数,依赖初始种子值,重复使用相同种子会得到完全相同的随机序列。
内容的提问来源于stack exchange,提问作者IllTime00qw
相关产品推荐
相关产品推荐

