21xrx.com
2025-03-29 05:35:43 Saturday
文章检索 我的文章 写文章
C++生成不重复的随机数
2023-06-23 02:46:36 深夜i     13     0
C++ 生成 不重复 随机数 算法

生成不重复的随机数在编程中是一个常见的需求。对于C++语言,有多种方法可以实现这一目的。

一种方法是使用STL库中的algorithm头文件中的shuffle函数。这个函数可以随机打乱一个指定范围内的元素顺序,从而实现生成不重复的随机数。具体实现代码如下:

#include <algorithm>
#include <iostream>
#include <vector>
int main()
{
  std::vector<int> numbers = 3;
  std::random_device rd;
  std::mt19937 generator(rd());
  // shuffle the numbers
  std::shuffle(numbers.begin(), numbers.end(), generator);
  for (int i = 0; i < numbers.size(); i++) {
    std::cout << numbers[i] << " ";
  }
  std::cout << std::endl;
  return 0;
}

上述代码中,首先定义了一个包含10个数的vector,然后使用随机设备rd和mt19937生成器来初始化随机数生成器。随后调用shuffle函数对这个vector中的元素进行随机打乱。最后输出打乱后的vector中的数值。

除了使用STL中的shuffle函数外,还可以使用C++11标准中新增的uniform_int_distribution类来生成不重复的随机数。uniform_int_distribution可以以指定的范围(如1到10)生成均匀分布的整数序列。具体实现代码如下:

#include <iostream>
#include <random>
#include <vector>
int main()
{
  std::vector<int> numbers(10);
  std::random_device rd;
  std::mt19937 generator(rd());
  std::uniform_int_distribution<int> distribution(1, 10);
  for (int i = 0; i < numbers.size(); i++) {
    int number;
    do {
      number = distribution(generator);
    } while (std::find(numbers.begin(), numbers.begin() + i, number) != numbers.begin() + i);
    numbers[i] = number;
  }
  for (int i = 0; i < numbers.size(); i++) {
    std::cout << numbers[i] << " ";
  }
  std::cout << std::endl;
  return 0;
}

上述代码中,首先定义了一个包含10个元素的vector,然后使用随机设备rd和mt19937生成器来初始化随机数生成器。接着定义一个范围为1到10的uniform_int_distribution对象distribution,用于生成1到10之间的随机整数。然后使用循环生成10个不重复的随机数,并将它们写入vector中。最后输出生成的不重复随机数。

在编写生成不重复的随机数的程序时,还需要注意一些细节问题,如随机数的数量不能超过所选范围的大小,否则无法生成不重复数列。此外,如果需要生成大量的不重复随机数,建议使用第二种方法,因为它更具有通用性和灵活性,能够满足更加复杂的生成规则。

  
  

评论区

请求出错了