# 6.20 Crap ``` https://openhome.cc/zh-tw/algorithm/randomness/craps/ //贏的機率 244/495 約為 0.493 //平均擲骰子次數 3+62/165 = 3.3(75), (75)為循環小數 #include <stdio.h> #include <stdlib.h> #include <time.h> #define LOST -1 #define WON 1 #define CONTINUE 0 #define N 1000 //總共玩的次數 #define M 20 int dice() { return (rand() % 6) + (rand() % 6) + 2; } int initialRoll(int firstPoint) { switch(firstPoint) { case 7: case 11: return WON; case 2: case 3: case 12: return LOST; default: return CONTINUE; } } int reRoll(int firstPoint, int point) { return firstPoint == point ? WON : (7 == point ? LOST : CONTINUE); } int main(void) { int i=0, j=0, k, x[N+1]={0}, y[N+1]={0}, sum=0, a=0; srand(time(NULL)); while (i<N){ int firstPoint = dice(), k=1; printf("玩家點數:[%d]\n", firstPoint); int status = initialRoll(firstPoint); while(status == CONTINUE) { int point = dice(); printf("玩家點數:%d\n", point); status = reRoll(firstPoint, point); k++; //擲骰子次數 } puts(status == WON ? "玩家勝" : "玩家輸"); if (status == WON) {j++; ++x[k];} if (status == LOST) ++y[k]; i++; //玩的次數 } printf("%d/%d\n", j, i); for (int r=1; r<=M; r++){ printf("%d %d; ", r, x[r]); sum+=x[r]; if (r==10) puts(""); } printf("%d\n", sum); for (int r=1; r<=M; r++){ printf("%d %d; ", r, y[r]); if (r==10) puts(""); } for (int r=1; r<=N; r++) a+=r*(x[r]+y[r]); printf("%.3f", ((float) a)/N); //平均遊戲長度 } ```