srand(seed):設置隨機種子。同一種子產生的序列完全相同。rand():返回 [0, RAND_MAX] 內的偽隨機整數(RAND_MAX ≥ 32767)。srand(time(NULL)) 利用當前時間秒數,每次運行序列不同。方法 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;
}
<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、取模偏差)。