You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中第二个数组为何生成异常重复随机数值?

解决C语言生成随机数时第二个数组全为相同值的问题

嘿,我一眼就看出你大概率踩了C语言随机数生成的经典坑!这种第二个数组全是相同值的情况,几乎都是**重复调用srand(time(NULL))**导致的,咱们一步步拆解:

问题根源

  • rand()是伪随机数生成器,它的输出完全依赖于初始设置的种子值(由srand()传入)。如果两次调用srand()用了相同的种子,后续rand()会生成完全一致的序列。
  • time(NULL)返回的是当前时间的秒级数值,程序生成两个数组的速度极快,间隔肯定小于1秒,这就导致两次调用srand(time(NULL))的种子完全相同。更糟的是,如果你的代码是在生成第二个数组的每个元素前都调用srand(),那同一秒内每次的种子都一样,rand()自然每次返回同一个值,就出现了全是10、全是7这种情况。

解决方案:只初始化一次随机种子

把srand(time(NULL))放在程序的最开始,整个程序运行期间只调用一次,在任何rand()调用之前执行。这样rand()会基于同一个种子生成连续的伪随机序列,两个数组的数值就会正常随机了。

修正后的示例代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ARRAY_SIZE 6 // 匹配你提到的数组长度

int main() {
    // 关键:只初始化一次随机种子,放在程序开头
    srand(time(NULL));

    int arr1[ARRAY_SIZE];
    int arr2[ARRAY_SIZE];

    // 生成第一个数组
    for (int i = 0; i < ARRAY_SIZE; i++) {
        arr1[i] = rand() % 20; // 这里可以根据你的需求调整随机数范围,比如0-19
    }

    // 生成第二个数组,无需再次调用srand()
    for (int i = 0; i < ARRAY_SIZE; i++) {
        arr2[i] = rand() % 20;
    }

    // 打印验证
    printf("第一个数组:");
    for (int i = 0; i < ARRAY_SIZE; i++) {
        printf("%d ", arr1[i]);
    }
    printf("\n第二个数组:");
    for (int i = 0; i < ARRAY_SIZE; i++) {
        printf("%d ", arr2[i]);
    }

    return 0;
}

额外小提示

如果需要生成指定范围的随机数(比如min到max),可以用公式:rand() % (max - min + 1) + min,这样能精准控制数值区间。

内容的提问来源于stack exchange,提问作者Dušo Morháč

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:21:16