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

C語言隨機數生成:擲硬幣模擬中函數調用拼寫錯誤與邏輯缺陷修正

     編輯:C 語言問答

原代碼三大錯誤


void flip(int x) {  // 參數 x 未使用
    for (x = 1; x <= 100; x++) {
        if (filp() == 1) {  // ❌ 1. 拼寫錯誤:filp vs flip
            // ...
        }
    }
}

int main() {
    int a = 0, b = 0;
    srand(time(NULL));
    printf("Heads: %d\n", a);  // ❌ 2. 統計變量在調用 flip() 前打印,永遠為 0
    printf("Tails: %d\n", b);
    return 0;  // ❌ 3. 未調用 flip() 函數!
}

修正版完整程序


#include 
#include 
#include 

// 返回 1: 正面, 0: 反面
int flip(void) {
    return rand() % 2;  // 0 或 1
}

int main(void) {
    int heads = 0, tails = 0;
    
    srand((unsigned)time(NULL));  // 種子,僅調用一次
    
    for (int i = 0; i < 100; i++) {
        if (flip() == 1) {
            heads++;
        } else {
            tails++;
        }
    }
    
    printf("Total Heads: %d\n", heads);
    printf("Total Tails: %d\n", tails);
    return 0;
}

關鍵修正點

錯誤類型原代碼修正
函數名拼寫filp()flip()
統計邏輯位置調用前打印循環內累加,循環後打印
函數調用缺失main 中未調用 flipfor 循環中調用 100 次
參數設計void flip(int x) 參數無用int flip(void) 無參返回結果
隨機數範圍無rand() % 2 產生 0/1

隨機數最佳實踐補充

  • srand(time(NULL)) **整個程序只調用一次**,通常在 main 開頭
  • rand() 質量一般,關鍵應用用 random() (BSD) 或 C++11 <random>
  • 需均勻分布區間 [min, max]:min + rand() / (RAND_MAX / (max - min + 1) + 1)
  • 線程安全:rand_r(&seed) 或 C++ thread_local 引擎

「拼寫錯誤、邏輯順序顛倒、函數未調用」是初學者**三大高頻低級錯誤**,養成「寫完先讀一遍、單步調試、單元測試」習慣可避免 90% 此類問題。

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