21xrx.com
2024-12-22 21:36:57 Sunday
登录
文章检索 我的文章 写文章
C++实现生成不重复的随机数算法
2023-07-14 05:39:10 深夜i     --     --
C++ 随机数 不重复 算法 实现

在计算机编程中,随机数生成是一个非常常见的需求。在某些情况下,我们需要生成一组随机数,而这些随机数又不能重复。今天我们将介绍一种使用C++实现的生成不重复随机数算法。

1. 随机数生成

在C++中,我们可以使用rand()函数来生成一个随机数。该函数的返回值为一个整型数,其范围为0到RAND_MAX之间。RAND_MAX的值是依赖于不同的编译器的,但通常都是2^15或2^31-1。注意,rand()函数每次被调用时都会返回不同的值。

2. 不重复随机数生成

如果我们只需要生成一组随机数,那么使用rand()函数就足够了。但是,如果我们需要生成一组不重复的随机数,该怎么办呢?

一种常见的方法是使用一个数组,将已经生成的随机数存储在其中,每次生成随机数时先检查数组是否已经包含该随机数,如果已经包含,则重新生成一个随机数,直到找到一个不在数组中的随机数。此方法的缺点是,在需要生成大量随机数时,每次检查数组是否包含随机数的开销将变得非常大。

另一种方法是使用C++标准库中的set容器。set容器是一个集合,其中不能有重复的元素。每次生成随机数后,将该数插入set中,如果set中已经包含该数,则需要重新生成一个随机数。由于set容器自动维护元素的顺序,并且能够高效地插入、删除和查找元素,因此使用set容器实现不重复随机数生成算法是一个不错的选择。

下面是使用set容器实现不重复随机数生成的C++代码:


#include <iostream>

#include <set>

#include <cstdlib>

#include <ctime>

int main()

{

  const int N = 10; // 需要生成的随机数的数量

  const int MAX_VALUE = 100; // 随机数的最大值

  std::set<int> nums; // 存储随机数的集合

  // 随机数生成器初始化

  std::srand(std::time(nullptr));

  // 生成不重复的随机数

  while (nums.size() < N)

  {

    int num = std::rand() % MAX_VALUE + 1;

    if (nums.count(num) == 0)

    {

      nums.insert(num);

    }

  }

  // 打印随机数

  for (auto num : nums)

  

    std::cout << num << " ";

  

  std::cout << std::endl;

  return 0;

}

代码解析:

1. 在程序内部定义了需要生成的随机数的数量N和随机数的最大值MAX_VALUE。

2. 定义了一个set 类型的nums变量,用于存储随机数。

3. 使用std::srand(std::time(nullptr))函数来初始化随机数生成器。

4. 进入while循环,生成随机数并插入set中,直到set中元素个数达到N为止。生成随机数时使用std::rand() % MAX_VALUE + 1产生指定范围内的随机数,注意要加1,否则最大的随机数无法生成。如果set中已经包含该随机数,则进入下一轮循环。

5. 最后使用for循环打印生成的随机数。

综上所述,使用set容器可以快速高效地实现不重复随机数的生成,且使用方便,代码简单易懂。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复