首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++11 通用隨機數生成器模板:支援所有 STL 容器、引擎與分布器詳解

     編輯:程式設計疑難解答

核心代碼模板

#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;
}

進階優化與最佳實踐

  1. 引擎靜態化避免重複構建:
    static thread_local std::mt19937 engine(std::random_device{}()); // Mersenne Twister 質量更高
  2. 分布器對象復用:若同範圍多次調用,將 dist 提為 static 或外部傳入。
  3. 範圍檢查:添加 if (l > r) swap(l, r); 防御性編程。
  4. 浮點數支持:將模板參數化分布器類型,支持 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 `` 庫提供了專業級隨機數設施。利用**插入迭代器**抹平容器差異,**模板**實現泛型,**引擎+分布器**分離設計保證統計質量。實際項目中建議封裝為工具類,統一管理引擎生命周期與種子策略。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved