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

C++ 從字符串數組中隨機取值的正確實現

     編輯:程式設計綜合問答

需求:定義一個字符串數組,隨機選取一個元素賦值給變量。初學者易混淆數組長度計算、隨機數範圍、字符串類型選擇(C 風格 vs std::string)。

問題代碼分析

auto n[] = {"\xda\x01...", "\xda\x01..."}; // 推導為 const char*[2]
auto key = nullptr;
jstring randomKey(jstring n[]) { // 參數類型錯誤,jstring 是 JNI 類型
    srand((unsigned)time((long*)0));
    int nlen = rand() % (sizeof(n)/sizeof(n[0])); // 錯誤:參數退化為指針,sizeof 失效
    return n[nlen]; // 返回類型不匹配
}

關鍵錯誤:

  • 數組作為參數傳遞時退化為指針,sizeof(n) 得到指針大小而非數組大小。
  • 混用 C 數組、std::string、JNI 類型 jstring。
  • srand 應只調用一次(程序啟動時),而非每次調用函數時。

標準 C++ 實現(推薦)

#include 
#include 
#include 
#include  // C++11 隨機庫,優於 rand()
#include 

std::string randomKey(const std::vector& arr) {
    if (arr.empty()) return "";
    static std::mt19937 gen(std::random_device{}()); // 靜態引擎,僅初始化一次
    std::uniform_int_distribution dist(0, arr.size() - 1);
    return arr[dist(gen)];
}

int main() {
    std::vector keys = {
        "\xda\x01\x09\xfc\xca\x98\x82\x33\x69\xaa\xc1\xdf\xbb\x40\x90\xcf",
        "\xda\x01\x09\xfc\xca\x98\x82\x33\x69\xaa\xc1\xdf\xbb\x40\x90\xcf"
    };
    std::cout << randomKey(keys) << std::endl;
    return 0;
}

C 風格兼容寫法(若必須用 C 數組)

#include 
#include 
#include 

const char* randomKeyC(const char* arr[], size_t len) {
    if (len == 0) return NULL;
    static int seeded = 0;
    if (!seeded) { srand((unsigned)time(NULL)); seeded = 1; }
    return arr[rand() % len];
}

int main() {
    const char* keys[] = {
        "\xda\x01\x09\xfc\xca\x98\x82\x33\x69\xaa\xc1\xdf\xbb\x40\x90\xcf",
        "\xda\x01\x09\xfc\xca\x98\x82\x33\x69\xaa\xc1\xdf\xbb\x40\x90\xcf"
    };
    printf("%s\n", randomKeyC(keys, sizeof(keys)/sizeof(keys[0])));
    return 0;
}

核心最佳實踐

  1. 用 std::vector:自帶大小、內存安全、支持標準算法。
  2. 用 <random> 替代 rand():mt19937 + uniform_int_distribution 質量高、線程安全、無模數偏差。
  3. 隨機引擎靜態化:避免重複種子導致同一序列。
  4. 傳遞數組大小:C 數組參數退化,必須額外傳長度。

掌握現代 C++ 隨機庫與容器用法,能寫出更安全、高效、可維護的代碼。

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