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

如何在循环中检查随机值重复并返回值?求生成不重复随机值的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:33:31