📅  最后修改于: 2023-12-03 15:37:18.728000             🧑  作者: Mango
在C++中,可以使用 std::vector
类型来存储一组数据,并提供了很多方法来方便我们对这些数据进行操作。其中,选取一个随机元素是常见需求。下面将介绍几种实现方法。
rand()
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
int main()
{
// 初始化随机数种子
std::srand(std::time(nullptr));
std::vector<int> vec = {1, 2, 3, 4, 5};
// 随机生成一个下标
int index = std::rand() % vec.size();
// 输出随机选中的元素
std::cout << vec[index] << std::endl;
return 0;
}
这种方法使用了 rand()
函数来生成一个随机数,然后对当前向量的大小取模得到随机下标。需要注意的是,每次运行程序生成的随机数序列都是相同的,因此需要先用 srand()
函数初始化随机数种子。
但是 rand()
函数并不是真正的随机数生成器,并不能保证生成的随机数具有真正的随机性,因此这种方法并不是很安全可靠。
<random>
头文件#include <iostream>
#include <vector>
#include <random>
int main()
{
std::vector<int> vec = {1, 2, 3, 4, 5};
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, vec.size() - 1);
int index = dis(gen);
std::cout << vec[index] << std::endl;
return 0;
}
这种方法使用了 <random>
头文件提供的随机数生成器。其中,std::random_device
类用于生成一些真正随机的种子,std::mt19937
类用于生成随机数序列,std::uniform_int_distribution
类用于生成一个指定区间内的随机整数。这种方法比起使用 rand()
函数,更加安全可靠,生成的随机数具有真正的随机性。
<algorithm>
头文件#include <iostream>
#include <vector>
#include <random>
#include <algorithm>
int main()
{
std::vector<int> vec = {1, 2, 3, 4, 5};
std::random_device rd;
std::mt19937 gen(rd());
std::shuffle(vec.begin(), vec.end(), gen);
std::cout << vec[0] << std::endl;
return 0;
}
这种方法使用了 C++11 新增的 <algorithm>
头文件中的 std::shuffle()
函数,该函数可以将一个区间内的元素随机打乱。可以直接调用该函数,然后取区间的第一个元素作为选中的随机元素。这种方法的优点是代码简单,直观易懂。
以上三种方法都可以实现从向量中选取一个随机元素,并具有不同的优缺点,在实际编写代码时可以根据实际需求选择合适的方法。