21xrx.com
2024-11-05 14:53:39 Tuesday
登录
文章检索 我的文章 写文章
C++生成不重复的随机数
2023-06-23 02:46:36 深夜i     --     --
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中。最后输出生成的不重复随机数。

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

  
  

评论区

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