#include // rand, srand, RAND_MAX
#include // time (用於種子)
int rand(void); // 返回 0 ~ RAND_MAX 間偽隨機數
void srand(unsigned int seed); // 設置種子
RAND_MAX 至少 32767(15 位)。
[0, N) : rand() % N
[a, b) : rand() % (b - a) + a
[a, b] 閉區間: rand() % (b - a + 1) + a
double r = rand() / (double)RAND_MAX;
srand((unsigned)time(NULL)); // 當前時間作種子,每次運行結果不同
若不調用 srand,默認等同 srand(1),每次運行產生相同序列。
time(NULL) 秒級時間,或 /dev/urandom、CryptGenRandom 等熵源。// 典型參數(ANSI C / glibc 等各異)
seed = (seed * 1103515245 + 12345) % (1u << 31);
return (int)(seed >> 16) & 0x7FFF;
| 錯誤做法 | 後果 | 正確做法 |
|---|---|---|
| 循環中反覆 srand(time(NULL)) | 若循環極快,種子相同 → 產生相同數 | 程序啟動時 僅調用一次 srand |
| 用 rand()%N 產生大範圍數 | 低位隨機性差,分布不均 | 用浮點縮放或更好算法(C++11 |
| 多線程共用 rand() | 非線程安全,序列交織混亂 | 用 thread_local 引擎或 C++11 |
| 加密場景用 rand() | 可預測,極不安全 | 用 /dev/urandom、CryptGenRandom、std::random_device |
#include
#include
std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());
// 均勻整數 [a, b]
std::uniform_int_distribution dist(a, b);
int r = dist(rng);
// 均勻浮點 [0, 1)
std::uniform_real_distribution distf(0.0, 1.0);
double rf = distf(rng);
優點:週期極長(2^19937-1)、統計特性優、線程安全、分布靈活。
srand 全程只調用一次,種子用高精度時間或熵源。rand()%,嚴謹場合用 C++11