# 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); //平均遊戲長度
}
```