C++中如何从整数vector中随机选取最小值元素?
解决方案
要实现从所有最小值的位置中随机选择一个,需要分三步完成:先找到最小值,收集所有最小值的位置,再随机选取其中一个。
具体实现步骤
- 第一步:获取vector中的最小值,依然可以用
min_element,它能正确返回最小值的数值(虽然只返回第一个出现的迭代器,但我们只需要它的值)。 - 第二步:遍历整个vector,把所有值等于最小值的元素的索引收集到一个容器里。
- 第三步:使用C++标准库的随机数工具,从收集到的位置中随机挑选一个。
完整代码示例
#include <iostream> #include <vector> #include <algorithm> #include <random> int main() { std::vector<int> vec {3, 4, 2, 1, 1, 3, 1}; // 获取最小值 int min_val = *std::min_element(vec.begin(), vec.end()); // 收集所有最小值的索引 std::vector<size_t> min_indices; for (size_t i = 0; i < vec.size(); ++i) { if (vec[i] == min_val) { min_indices.push_back(i); } } // 初始化随机数生成器 std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<size_t> dist(0, min_indices.size() - 1); // 随机选择一个索引 size_t selected_idx = min_indices[dist(gen)]; // 输出结果 std::cout << min_val << std::endl; std::cout << "It is at a distance of: " << selected_idx << std::endl; return 0; }
代码说明
- 收集索引的方式更直观,输出距离时直接使用索引即可;也可以改用收集迭代器,逻辑类似。
- 随机数部分用
std::random_device作为种子搭配std::mt19937生成器,比传统的srand(time(0))更可靠,能避免短时间内多次运行导致种子重复的问题。 std::uniform_int_distribution保证了每个最小值位置被选中的概率均等。
内容的提问来源于stack exchange,提问作者user3243499
相关产品推荐
相关产品推荐

