首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

(骰子游戏)Craps game的算法有关问题

2012-02-28 
(骰子游戏)Craps game的算法问题.下面有两个问题:赌博游戏Crapsgame胜率的评价与比较.(什么是赌博游戏Crap

(骰子游戏)Craps game的算法问题.
下面有两个问题:   赌博游戏   Craps   game   胜率的评价与比较.
(什么是赌博游戏   Craps   game   :一个简单的赌博游戏,游戏规则如下:玩家掷两个骰子,点数为1到6,如果第一次点数和为7或11,则玩家胜,如果点数和为2、3或12,则玩家输,如果和为其它点数,则记录第一次的点数和,然后继续掷骰,直至点数和等于第一次掷出的点数和,则玩家胜,如果在这之前掷出了点数和为7,则玩家输。)

   
1.第一种方法:c++模拟的方法.(这个我可能知道一点答案,但是很想知道各位前辈的思路)
   
2.第二种方法:数学概率计算的方法.(这个就是原话,我也不是很明白到底是个什么意思)(c++怎么实现数学概率计算的方法??)(这个题重点看看吧)

各路兄台都来看一下吧,我想要准确的结果,先谢谢大家了,知道多少就赐教多少吧.后辈不胜感激.

[解决办法]
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void simulate(int times,int *win,int *lose)
{
int i;
int num_rand1,num_rand2;
int sum,sum_tmp;

srand(time(NULL));
for(i=0;i <times;i++)
{
num_rand1=rand()%6+1;
num_rand2=rand()%6+1;
sum=num_rand1+num_rand2;

if(sum==7 || sum==11)
(*win)++;
else if(sum==2 || sum==3 || sum==12)
(*lose)++;
else
{
while(1)
{
num_rand1=rand()%6+1;
num_rand2=rand()%6+1;
sum_tmp=num_rand1+num_rand2;
if(sum==sum_tmp)
{
(*win)++;
break;
}
else if(sum_tmp==7)
{
(*lose)++;
break;
}
}
}
}
return ;
}
int main()
{
double rate_win,rate_lose;
int times_win,times_lose;
int times;

times=0x007fffff;
times_win=0;
times_lose=0;
simulate(times,&times_win,&times_lose);

rate_win=(double)times_win/times;
rate_lose=(double)times_lose/times;

printf( "simulate result:\n ");
printf( "times:%d time win:%d times lose:%d\n ",times,times_win,times_lose);
printf( "rate win:%f rate lose:%f\n ",rate_win,rate_lose);

getchar();
return 0;
}
似乎输的概率比赢的概率稍微高一些,如果赌场每天几百亿流动量的话,还有的赚


[解决办法]
1)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int rollDice(void);

main(void)
{
int gamestatus,sum,mypoint; //定义 赢输, 点数和,点数
char choice;

printf( "game start(Y/N)? ");
scanf( "%c ",&choice);
while(choice != 'N ' && choice != 'n ')
{
srand(time(NULL));
sum=rollDice(); //第一次投掷
switch (sum)
{
case 7:
case 11: //第一次投掷就赢了
gamestatus=1;
break;
case 2:
case 3:
case 12: //第一次投掷就输了
gamestatus=2;
break;
default:
gamestatus=0;
mypoint=sum;
printf( "play first point is %d\n ",mypoint);
break;
}

while (gamestatus==0) //继续投掷
{
sum=rollDice();

if (sum==mypoint)
gamestatus=1; //因为掷出了自己的点数,所以赢了
else
if (sum==7) //因为掷出了7,所以输了
gamestatus=2;
}

if (gamestatus==1)
{
printf( "Player win\n ");

}
else
{
printf( "player lose\n ");
}
printf( "Please countin(Y/N)? ");
getchar();
scanf( "%c ",&choice);
}

return 0;
}

int rollDice(void)
{
int Renmian1,Renmian2,RenSum;

Renmian1=1+(rand()%6);


Renmian2=1+(rand()%6);

RenSum=Renmian1+Renmian2;

printf( "Player point is %d+%d=%d\n ",Renmian1,Renmian2,RenSum);

return
RenSum;
}


2)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void simulate(int times,int *win,int *lose)
{
int i;
int num_rand1,num_rand2;
int sum,sum_tmp;


srand(time(NULL));
for(i=0;i <times;i++)
{
num_rand1=rand()%6+1;
num_rand2=rand()%6+1;
sum=num_rand1+num_rand2;

if(sum==7 || sum==11)
(*win)++;
else if(sum==2 || sum==3 || sum==12)
(*lose)++;
else
{
while(1)
{
num_rand1=rand()%6+1;
num_rand2=rand()%6+1;
sum_tmp=num_rand1+num_rand2;
if(sum==sum_tmp)
{
(*win)++;
break;
}
else if(sum_tmp==7)
{
(*lose)++;
break;
}
}
}
}
return ;
}
int main()
{
double rate_win,rate_lose;
int times_win,times_lose;
int times;

times=10000;
times_win=0;
times_lose=0;
simulate(times,&times_win,&times_lose);

rate_win=(double)times_win/times;
rate_lose=(double)times_lose/times;

printf( "simulate result:\n ");
printf( " times:%d\n times win:%d\n times lose:%d\n ",times,times_win,times_lose);
printf( " rate win:%f\n rate lose:%f\n ",rate_win,rate_lose);


getchar();
return 0;
}


热点排行