#include
#include
#include
int main(void) {
srand((unsigned)time(NULL)); // 以當前時間為種子,確保每次運行結果不同
for (int i = 0; i <= 20; i++) {
if (i % 5 == 0) putchar('\n'); // 每 5 個換行
int face = 1 + rand() % 6; // 縮放至 1~6
printf("%10d", face);
}
putchar('\n');
return 0;
}
| 函數/運算 | 作用 |
|---|---|
rand() | 返回 0 到 RAND_MAX (至少 32767) 之間的偽隨機整數 |
srand(seed) | 設定隨機數種子,相同種子產生相同序列 |
time(NULL) | 取得當前 Unix 時間戳,常用作種子 |
1 + rand() % 6 | 將範圍映射到 1~6(含邊界) |
srand → 每次執行產生相同序列。srand(time(NULL)) → 若循環極快,種子相同導致重複數列。main 開頭呼叫一次 srand。rand() % n 有模數偏差(當 RAND_MAX+1 不能被 n 整除)。嚴格均勻需用拒絕採樣:while ((x = rand()) >= RAND_MAX - RAND_MAX % n); return 1 + x % n;<random.h> 或 C++ <random> 提供更高品質分佈(Mersenne Twister 等),關鍵系統建議升級。int freq[7] = {0};
const int TRIALS = 1000000;
for (int i = 0; i < TRIALS; i++) freq[1 + rand() % 6]++;
for (int f = 1; f <= 6; f++) printf("%d: %.4f%%\n", f, freq[f]*100.0/TRIALS);
模擬骰子是 rand() 入門經典範例。掌握「種子初始化一次、縮放映射、模數偏差認知」三要點,即可正確應用於遊戲、模擬、測試資料生成等場景。生產環境涉及安全或高精度需求時,請改用密碼學級隨機數生成器(/dev/urandom、CryptGenRandom、std::random_device)。