首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++用没有重复的随机数填充数组

在C++中,生成没有重复的随机数并填充数组可以通过以下步骤实现:

基础概念

  1. 随机数生成:使用<cstdlib>库中的rand()函数生成随机数。
  2. 去重:确保生成的随机数不在数组中已经存在。
  3. 洗牌算法:一种常用的去重方法是先生成一个有序数组,然后使用洗牌算法(如Fisher-Yates算法)打乱数组顺序。

相关优势

  • 简单高效:洗牌算法的时间复杂度为O(n),非常高效。
  • 易于实现:代码逻辑清晰,易于理解和维护。

类型与应用场景

  • 类型:适用于需要随机且不重复的数据集合的场景。
  • 应用场景:游戏中的随机地图生成、随机抽样调查、密码学中的密钥生成等。

示例代码

以下是一个完整的C++示例,展示如何生成没有重复的随机数并填充数组:

代码语言:txt
复制
#include <iostream>
#include <vector>
#include <cstdlib> // for rand() and srand()
#include <ctime>   // for time()

void shuffleArray(std::vector<int>& array) {
    for (int i = array.size() - 1; i > 0; --i) {
        int j = rand() % (i + 1);
        std::swap(array[i], array[j]);
    }
}

std::vector<int> generateUniqueRandomNumbers(int size, int min, int max) {
    if (size > (max - min + 1)) {
        throw std::invalid_argument("Cannot generate more unique numbers than the range allows.");
    }

    std::vector<int> numbers;
    for (int i = min; i <= max; ++i) {
        numbers.push_back(i);
    }

    srand(time(0)); // Seed the random number generator
    shuffleArray(numbers);

    std::vector<int> result(numbers.begin(), numbers.begin() + size);
    return result;
}

int main() {
    int arraySize = 10;
    int minValue = 1;
    int maxValue = 100;

    try {
        std::vector<int> randomNumbers = generateUniqueRandomNumbers(arraySize, minValue, maxValue);

        std::cout << "Generated unique random numbers: ";
        for (int num : randomNumbers) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    } catch (const std::invalid_argument& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }

    return 0;
}

解释

  1. 生成有序数组:首先创建一个包含所有可能值的有序数组。
  2. 洗牌算法:使用Fisher-Yates洗牌算法随机打乱数组顺序。
  3. 截取所需长度:根据需要的数组长度截取打乱后的数组部分。

可能遇到的问题及解决方法

  • 重复数字问题:确保size不超过max - min + 1,否则无法生成足够的不重复数字。
  • 随机性不足:使用srand(time(0))确保每次运行程序时随机数序列不同。

通过这种方法,你可以高效且可靠地生成没有重复的随机数数组,适用于多种编程需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的视频

领券