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

如何在C++中实现返回包含随机数的数组?

解决C++随机数函数返回数组的问题

你的代码存在几个关键问题导致无法正确返回数组:

  1. 栈上的局部数组int random[n]在函数执行完毕后会被销毁,直接返回它的指针会得到野指针,访问时触发未定义行为
  2. int tempArr = random[n]; 是越界访问(数组索引从0到n-1),且赋值逻辑完全无效,应该删除这行
  3. 原随机数生成逻辑lower + (rand() % upper)的范围不符合常规需求(实际是[lower, lower+upper-1]),需要调整才能生成[lower, upper]区间的数

下面提供三种可行的解决方案,按推荐程度排序:

方案1:使用std::vector<int>(最推荐,C++原生安全方案)

std::vector会自动管理内存,不需要手动释放,支持直接返回和后续操作:

#include <vector>
#include <cstdlib>
#include <ctime>
#include <iostream>

std::vector<int> generateRandomNumbers(int lower, int upper) {
    const int n = 5;
    std::vector<int> random(n); // 初始化大小为5的vector

    srand(static_cast<unsigned>(time(nullptr)));

    for (int i = 0; i < n; ++i) {
        // 生成[lower, upper]区间的随机数
        random[i] = lower + (rand() % (upper - lower + 1));
        std::cout << random[i] << " ";
    }

    return random;
}

// 调用示例
int main() {
    auto nums = generateRandomNumbers(1, 10);
    std::cout << "\n存储的随机数:";
    for (int num : nums) {
        std::cout << num << " ";
    }
    return 0;
}

方案2:动态分配堆内存(C风格,需手动管理内存)

通过new在堆上分配数组,返回指针,但调用者必须记得用delete[]释放内存,避免泄漏:

#include <cstdlib>
#include <ctime>
#include <iostream>

int* generateRandomNumbers(int lower, int upper) {
    const int n = 5;
    int* random = new int[n]; // 堆上分配内存

    srand(static_cast<unsigned>(time(nullptr)));

    for (int i = 0; i < n; ++i) {
        random[i] = lower + (rand() % (upper - lower + 1));
        std::cout << random[i] << " ";
    }

    return random;
}

// 调用示例
int main() {
    int* nums = generateRandomNumbers(1, 10);
    std::cout << "\n存储的随机数:";
    for (int i = 0; i < 5; ++i) {
        std::cout << nums[i] << " ";
    }
    delete[] nums; // 必须手动释放内存
    return 0;
}

方案3:调用者传入数组(无需返回,直接填充)

让调用者提前准备好数组,函数负责填充内容,适合需要复用已有数组的场景:

#include <cstdlib>
#include <ctime>
#include <iostream>

void generateRandomNumbers(int lower, int upper, int* arr, int size) {
    srand(static_cast<unsigned>(time(nullptr)));

    for (int i = 0; i < size; ++i) {
        arr[i] = lower + (rand() % (upper - lower + 1));
        std::cout << arr[i] << " ";
    }
}

// 调用示例
int main() {
    const int n = 5;
    int nums[n]; // C++11及以后支持const int定义数组大小
    generateRandomNumbers(1, 10, nums, n);
    std::cout << "\n存储的随机数:";
    for (int num : nums) {
        std::cout << num << " ";
    }
    return 0;
}

额外说明

  • 如果只需要生成[lower, upper)左闭右开区间的随机数,把随机数生成逻辑改成lower + rand() % (upper - lower)即可
  • srand(static_cast<unsigned>(time(nullptr)))只需要调用一次,建议放在main函数开头,不要在每次调用生成函数时重复调用,否则短时间内多次调用会生成相同的随机数序列

内容的提问来源于stack exchange,提问作者Mugiwara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:54:51