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

C語言隨機數應用:模擬擲六面骰子

     編輯:關於C

核心程式碼

#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;
  • 🔧 C11 <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)。

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