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

C語言模擬擲骰子遊戲:Craps規則實現與勝率統計

     編輯:關於C

前言

經典賭場遊戲 Craps(街頭骰子)規則簡單:擲兩顆骰子,首擲和為 7/11 莊家贏,2/3/12 莊家輸(Craps out),其他點數進入「點數階段」。本文實現首擲勝率統計模擬,10,000 次獨立試驗,驗證理論概率(勝 2/9 ≈ 0.2222,負 1/9 ≈ 0.1111)。

一、遊戲規則邏輯

  • 兩顆獨立骰子,每顆 1~6 均勻分布。
  • 和值分布:2(1/36), 3(2/36), 4(3/36), 5(4/36), 6(5/36), 7(6/36), 8(5/36), 9(4/36), 10(3/36), 11(2/36), 12(1/36)。
  • 首擲勝:7(6/36) + 11(2/36) = 8/36 = 2/9 ≈ 0.2222。
  • 首擲負:2(1/36) + 3(2/36) + 12(1/36) = 4/36 = 1/9 ≈ 0.1111。

二、完整 C 代碼


#include 
#include 
#include 

#define ROLLS 10000

void diceRoll(int *d1, int *d2) {
    *d1 = 1 + rand() % 6;
    *d2 = 1 + rand() % 6;
}

int main() {
    unsigned int seed;
    printf("Enter an integer seed value: ");
    if (scanf("%u", &seed) != 1) return 1;
    srand(seed);

    int wins = 0, losses = 0;
    for (int i = 0; i < ROLLS; i++) {
        int d1, d2;
        diceRoll(&d1, &d2);
        int sum = d1 + d2;
        if (sum == 7 || sum == 11) wins++;
        else if (sum == 2 || sum == 3 || sum == 12) losses++;
    }

    printf("Number of wins: %d\n", wins);
    printf("Probability of winning: %.4f\n", (double)wins / ROLLS);
    printf("Number of losses: %d\n", losses);
    printf("Probability of losing: %.4f\n", (double)losses / ROLLS);
    return 0;
}

三、關鍵實現細節

四、運行示例


Enter an integer seed value: 1
Number of wins: 2230
Probability of winning: 0.2230
Number of losses: 1098
Probability of losing: 0.1098

Enter an integer seed value: 102
Number of wins: 2258
Probability of winning: 0.2258
Number of losses: 1072
Probability of losing: 0.1072

結果隨種子波動,但均貼近理論值 0.2222 / 0.1111。

五、擴展:完整 Craps 遊戲(含點數階段)


int playCraps() {
    int d1, d2, sum, point;
    diceRoll(&d1, &d2);
    sum = d1 + d2;
    if (sum == 7 || sum == 11) return 1;      // 立即勝
    if (sum == 2 || sum == 3 || sum == 12) return 0; // 立即負
    point = sum;                               // 進入點數階段
    while (1) {
        diceRoll(&d1, &d2);
        sum = d1 + d2;
        if (sum == point) return 1;            // 再擲中點數 → 勝
        if (sum == 7) return 0;                // 擲到7 → 負
    }
}

完整遊戲勝率約 0.4929(莊家優勢 ~1.4%),是經典概率課教案。

六、總結

這個小程式涵蓋:隨機數生成、模擬實驗設計、統計頻率估計概率、用戶種子可復現、函數模組化。是概率論、統計學、C語言程式設計交叉的優秀練習題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
項目說明
隨機種子用戶輸入 unsigned int,srand() 初始化,保證可復現
骰子函數diceRoll 透過指標返回兩顆骰子值,符合題目要求
均勻分布1 + rand() % 6 產生 1~6(假設 RAND_MAX 足大,偏差可忽略)
統計精度10,000 次試驗,標準誤差 ~0.004,足以觀測收斂趨勢
輸出格式符合題目範例:勝/負次數與機率保留 4 位小數