21xrx.com
2024-12-23 01:37:47 Monday
登录
文章检索 我的文章 写文章
C++如何生成不重复的随机数?
2023-06-30 04:16:08 深夜i     --     --
C++ 生成 不重复 随机数

在编程中,生成随机数是很常见的操作,它常用于测试、模拟和随机化等场景。在C++中,我们可以使用库函数来生成随机数,但有时候需要保证随机数的生成不重复,特别是在游戏开发和密码学等领域。 那么,C++如何生成不重复的随机数呢?下面介绍几种方法。

1. 使用洗牌算法

洗牌算法是一种将数组乱序的算法,我们可以把要生成的随机数放在一个数组中,然后通过洗牌算法打乱顺序,最后取出前几个数即可。这种方法不需要额外的空间来存储生成的随机数,因此比较节省资源。洗牌算法的基本思想是,每次将数组中的一个元素随机交换到另一个位置,最终打乱整个数组。下面给出一个示例代码:


#include <algorithm>

#include <vector>

#include <ctime>

int main() {

 srand(static_cast<unsigned int>(time(nullptr))); // 设置随机种子

 std::vector<int> nums 8; // 要生成的随机数

 std::random_shuffle(nums.begin(), nums.end()); // 洗牌

 for (int i = 0; i < 5; ++i) {

  std::cout << nums[i] << " "; // 取前5个随机数

 }

 std::cout << std::endl;

 return 0;

}

2. 使用set容器

set是C++ STL中的一个容器,它可以自动去重,即每次插入相同的元素只会保留一个。我们可以使用set容器来生成不重复的随机数,具体实现可参考下面的示例代码:


#include <set>

#include <ctime>

int main() {

 std::set<int> nums; // 存储生成的随机数

 srand(static_cast<unsigned int>(time(nullptr))); // 设置随机种子

 while (nums.size() < 5) { // 生成5个不重复的随机数

  nums.insert(rand() % 10 + 1);

 }

 for (auto& num : nums)

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

 

 std::cout << std::endl;

 return 0;

}

3. 使用随机数生成器

在C++11中,增加了一个random库,它提供了一组标准随机数生成器和分布函数,可以更灵活地生成随机数。我们可以通过使用随机数生成器,每次生成的随机数都是不重复的。以下是一个示例代码:


#include <random>

#include <iostream>

int main() {

 std::set<int> nums; // 存储生成的随机数

 std::random_device rd; // 随机种子

 std::mt19937 gen(rd()); // 随机数生成器

 std::uniform_int_distribution<int> dis(1, 10); // 随机数分布

 while (nums.size() < 5) { // 生成5个不重复的随机数

  nums.insert(dis(gen));

 }

 for (auto& num : nums)

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

 

 std::cout << std::endl;

 return 0;

}

以上是C++生成不重复的随机数的几种方法,具体选择哪种方法取决于具体需求。在实际应用中,比较常用的是洗牌算法和随机数生成器。无论哪种方法,都需要设置好随机种子,保证每次生成的随机数是不重复的。

  
  

评论区

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