#include <random>
#include <iterator>
#include <chrono>
template <class Container>
Container getRandom(int num, int l, int r) {
Container container; // 目標容器
std::uniform_int_distribution<unsigned> dist(l, r); // 均勻整數分布 [l, r]
std::default_random_engine engine(std::chrono::steady_clock::now().time_since_epoch().count()); // 隨機引擎
auto it = std::inserter(container, container.begin()); // 插入迭代器
while (num--) {
*it = dist(engine); // 生成隨機數並插入
}
return container;
}
| 組件 | 頭文件 | 作用 | 關鍵點 |
|---|---|---|---|
uniform_int_distribution<T> |
<random> |
定義隨機數分布範圍與類型 | 模板參數為生成類型 (int/long/unsigned),構造函數傳入閉區間 [min, max] |
default_random_engine |
<random> |
隨機數引擎 (產生原始比特流) | C++11 標準引擎,實現相關。種子推薦用 chrono::steady_clock::now().time_since_epoch().count() 高精度時間戳 |
inserter(c, c.begin()) |
<iterator> |
插入迭代器適配器 | 將賦值操作 *it = val 轉為 c.insert(it, val),**所有標準容器均支持**,實現模板通用性 |
#include <vector>
#include <list>
#include <deque>
#include <set>
#include <iostream>
int main() {
// 生成 10 個 [1, 100] 的隨機數到 vector
auto vec = getRandom<std::vector<int>>(10, 1, 100);
for (int x : vec) cout << x << ' '; cout << '\n';
// 生成 5 個 [0, 10] 到 list
auto lst = getRandom<std::list<int>>(5, 0, 10);
for (int x : lst) cout << x << ' '; cout << '\n';
// 生成 8 個 [100, 200] 到 set (自動去重排序)
auto st = getRandom<std::set<int>>(8, 100, 200);
for (int x : st) cout << x << ' '; cout << '\n';
return 0;
}
static thread_local std::mt19937 engine(std::random_device{}()); // Mersenne Twister 質量更高
dist 提為 static 或外部傳入。if (l > r) swap(l, r); 防御性編程。uniform_real_distribution。#include <random>
#include <iterator>
#include <chrono>
#include <type_traits>
template <class Container, class Dist = std::uniform_int_distribution<typename Container::value_type>>
Container randomFill(size_t count, typename Container::value_type minVal, typename Container::value_type maxVal) {
Container c;
static thread_local std::mt19937 eng(std::chrono::steady_clock::now().time_since_epoch().count());
Dist dist(minVal, maxVal);
auto it = std::inserter(c, c.begin());
while (count--) *it = dist(eng);
return c;
}
// 用法:auto v = randomFill<std::vector<double>, std::uniform_real_distribution<double>>>(10, 0.0, 1.0);
C++11 `