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

C/C++ 隨機數生成詳解:srand/rand 與區間映射技巧

     編輯:關於C++

核心函數

  • srand(seed):設置隨機種子。同一種子產生的序列完全相同。
  • rand():返回 [0, RAND_MAX] 內的偽隨機整數(RAND_MAX ≥ 32767)。
  • 常用種子:srand(time(NULL)) 利用當前時間秒數,每次運行序列不同。

生成指定區間 [a, b] 的隨機整數

方法 1:取模(有偏差)
int r = rand() % (b - a + 1) + a;
當 RAND_MAX+1 不能整除區間長度時,分布不均勻。

方法 2:浮點縮放(推薦,均勻)
先得到 [0,1) 實數,再線性映射:

double random01() { return (double)rand() / (RAND_MAX + 1.0); }
int random_int(int a, int b) { // [a, b]
    return (int)(random01() * (b - a + 1)) + a;
}

或四捨五入版:(int)(random01() * (b - a) + a + 0.5)。

完整示例

#include 
#include 
#include 

int main() {
    srand(time(NULL));
    // 生成 100 個 [1, 100] 的隨機數
    for (int i = 0; i < 100; ++i) {
        int r = rand() % 100 + 1; // 簡單版
        printf("%d ", r);
    }
    return 0;
}

進階:C++11 <random>(現代寫法)

#include 
#include 

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(1, 100);
    for (int i = 0; i < 10; ++i)
        std::cout << dis(gen) << ' ';
    return 0;
}

優點:高質量隨機引擎(梅森旋轉)、標準分布、無模偏差、線程安全。

總結

舊式 rand() 適合簡單場合,但分布質量差、有模偏差、非線程安全。現代 C++ 應優先使用 <random> 庫。理解種子機制、區間映射原理,有助於避免常見坑(如忘記 srand、取模偏差)。

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