首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

快速可預製隨機陣列生成法:Matlab 預計算隨機池 + 索引跳躍存取

     編輯:關於C++

工程模擬、加密系統常需大量高品質隨機數。標準 `rand()` 週期短、相關性強、種子敏感。本文提出「預計算隨機池 + 索引跳躍」混合策略:離線用 Matlab 生成高品質隨機數表,線上 O(1) 存取,兼顧統計特性與效能。

核心思想

  1. 離線預計算:Matlab 生成 1000 個常態分佈隨機數,儲存為結構化文本檔 (10 行 × 10 列,固定間距)
  2. 線上索引跳躍:時間種子決定起始索引,循環讀取所需數量
  3. 二次種子強化 (進階):讀取值作為下一輪種子,進一步打破殘餘相關性

文本隨機池格式


   0.1234   0.5678   0.9012   ... (10 個/行)
   0.3456   0.7890   0.2345   ...
   ...
共 100 行 = 1000 個數值,索引 0~999

核心演算法 (GetRandomArrayFromTxt)

void CRandomArrayFromTxt::GetRandomArrayFromTxt(
    int count, double* output, 
    int lines, int cols, int spacing) 
{
    CStdioFile file("random_pool.txt", CFile::modeRead | CFile::typeText);
    srand((unsigned)time(NULL));
    int startIdx = rand() % lines;           // 0~999
    int startRow = startIdx / cols;
    int startCol = startIdx % cols;
    int rowsNeeded = (count + startCol - 1) / cols + 1;
    
    // 定位到起始行
    CString line;
    for (int i = 0; i < startRow; i++) file.ReadString(line);
    
    int collected = 0;
    for (int r = 0; r < rowsNeeded && collected < count; r++) {
        if (startRow + r >= lines) file.SeekToBegin();  // 循環
        file.ReadString(line);
        
        // 解析行內數值 (固定間距分隔)
        int col = (r == 0) ? startCol : 0;
        for (; col < cols && collected < count; col++) {
            int pos = line.Find("   ");  // 3 空格分隔
            output[collected++] = atof(pos == -1 ? line : line.Left(pos));
            if (pos != -1) line = line.Right(line.GetLength() - pos - spacing);
        }
    }
    file.Close();
}

關鍵參數

參數說明建議值
池大小總隨機數量≥ 10000 (視應用規模)
分佈類型常態/均勻/指數等按領域需求
行列結構便於索引計算100×100 或 1000×10
分隔符固定寬度解析3~4 空格或 Tab

進階策略:二次種子鏈

// 讀取值作為下一輪種子
unsigned seed = (unsigned)time(NULL);
for (int i = 0; i < count; i++) {
    srand(seed);
    int idx = rand() % POOL_SIZE;
    output[i] = pool[idx];
    seed = (unsigned)(pool[idx] * 1e9);  // 浮點數轉種子
}

優點:打破線性讀取模式,殘餘週期極長。缺點:需浮點轉整數,微幅效能損耗。

效能與品質權衡

  • 速度:O(1) 存取,無運算開銷,極適合即時系統
  • 統計特性:繼承 Matlab 生成器品質 (Mersenne Twister 等)
  • 週期:池大小 × 索引組合數,實際應用足夠
  • 記憶體:1000 double ≈ 8KB,極輕量

適用場景與限制

適用不適用
蒙地卡羅模擬、測試資料生成密碼學級亂數 (需 CSPRNG)
遊戲掉寶/程序生成高安全性金鑰生成
嵌入式系統無硬體 RNG需嚴格可重現性的科學計算

原始碼下載

完整 MFC 類別實作 (`CRandomArrayFromTxt`)、Matlab 生成腳本、測試專案已附於配套資源。

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