/******************************************************************
附一: P新郎 计算工具
*******************************************************************/
#include
#include
double _p_win_A_in_B_games(double dWinPossiblity ,int a ,int b);
void usage(const char * argv0)
{
?printf("useage:\n\t");
?printf("%s ? \n",argv0);
?printf("MUST 0< <1 AND 0<= ? <= ? AND >0 \n");
?printf("for example : %s 0.2 20 5 \n",argv0);
}
int main(int argc,char** argv)
{
?if (4!= argc)
?{
??usage(argv[0]);
??return 1;
?}
?double dWinPossiblity;
?int iGameTimes ,iHitTimes;
?dWinPossiblity=atof(argv[1]);
?iGameTimes=atoi(argv[2]);
?iHitTimes=atoi(argv[3]);
?if ( dWinPossiblity<=0? || dWinPossiblity >=1 )
?{
??usage(argv[0]);
??return 1;
?}
?if (iHitTimes <0 || iHitTimes> iGameTimes)
?{
??usage(argv[0]);
??return 1;
?}
?if (iGameTimes <=0)
?{
??usage(argv[0]);
??return 1;
?}
?double p,pAtLeast;
?int i;
?p= _p_win_A_in_B_games(dWinPossiblity ,iHitTimes ,iGameTimes);
?pAtLeast=p;
?for (i=iHitTimes+1;i<=iGameTimes;i++)
?{
??pAtLeast+= _p_win_A_in_B_games(dWinPossiblity ,i ,iGameTimes);
?}
?printf("%f %f\n",p,pAtLeast);
?return 0;
}
template
T times(T iDiShu,int iZhishu)
{
?int i;
?if (iZhishu<=0 )
??return 1;
?T result=1;
?for (i=0;i?{
??result = result* iDiShu;
?}
?return result;
}
__int64 C(__int64 iDi,__int64 iJian)
{
?int i;
?__int64 result=1;
?for (i=0;i?{
??result=result * (iDi-i)? / (i+1);
?}
?return result;
}
double _p_win_A_in_B_games(double dWinPossiblity ,int a ,int b)
{
?double p;
?p=C(b,a) * times(dWinPossiblity,a) * times((1-dWinPossiblity),(b-a));
?return p;
}
?
?
?
/******************************************************************
附二: PTOM 计算工具
注这个程序比较蛮,耗内存略多,您凑合着用。
要是想整个"读写头循环队列"什么的来节约内存,我也试过,慢 ^^
*******************************************************************/
#include
#include
#include
#include
#include
#define SIMU_COUNT 100000
void usage(const char * argv0)
{
?printf("useage:\n\t");
?printf("%s ? \n",argv0);
?printf("MUST 0< <1 AND 0< <=? ? <= \n");
?printf("for example : %s 0.5 14? 20 100 \n",argv0);
}
int simu_game(double dWinPossiblity,int iCheckRange,int iUpDownCondition,int iGameTime );
int main(int argc, char* argv[])
{
?double dWinPossiblity;
?int iCheckRange,iUpDownCondition,iGameTime;
?
?if (5!=argc)
?{
??usage(argv[0]);
??return 1;
?}
?dWinPossiblity =atof(argv[1]);
?if ( dWinPossiblity<=0 || dWinPossiblity>=1)
?{
??usage(argv[0]);
??return 1;
?}
?iUpDownCondition= atoi(argv[2]);
?if (! (0?{
??usage(argv[0]);
??return 1;
?}
?iCheckRange= atoi(argv[3]);
?if (! (iUpDownCondition <= iCheckRange))
?{
??usage(argv[0]);
??return 1;
?}
?iGameTime= atoi(argv[4]);
?if (! (iCheckRange <= iGameTime))
?{
??usage(argv[0]);
??return 1;
?}
?simu_game( dWinPossiblity,iCheckRange, iUpDownCondition, iGameTime );
?return 0;
}
typedef enum
{
?UP =0,DOWN=1,KEEP=2
} LEVEL_DELTA;
LEVEL_DELTA simu_game_once(double dWinPossiblity,int iCheckRange,int iUpDownCondition,int iGameTime )
{
?char * pResults;
?//+1 is for making scan not to buffer overflow
?pResults=(char*)_alloca(sizeof(*pResults) * (iGameTime) +1);?
?int i,iThreshold;
?iThreshold= (int)(RAND_MAX *dWinPossiblity);
?//simulate game
?for (i=0;i?{
??pResults[i]= rand() < iThreshold;
?}
?// [pRangeStart,pRangeEnd] is the check range
?char * pRangeStart=pResults;
?char * pRangeEnd = &pResults[iCheckRange-1];
?int iWinCount=0;
?char * pWalk;
?//init chech range
?for (pWalk=pRangeStart; pWalk<=pRangeEnd; pWalk++ )
?{
??iWinCount+= *pWalk;
?}
?//scan
?char * pEndPosition;
?pEndPosition= pResults+iGameTime;
?int iDownCondition=(iCheckRange-iUpDownCondition );
?while (pRangeEnd < pEndPosition)
?{
??if (iWinCount >= iUpDownCondition )
???return UP;
??if (iWinCount <= iDownCondition)
???return DOWN;
??iWinCount-= *pRangeStart;
??
??pRangeStart++;
??pRangeEnd++;
??iWinCount+= *pRangeEnd;
?}
?return KEEP;
}
int simu_game(double dWinPossiblity,int iCheckRange,int iUpDownCondition,int iGameTime )
{
?srand(time(0));
?int i,Counter[4];
?memset((void*)Counter,0,sizeof Counter);
?for (i=0;i?{
??LEVEL_DELTA delta;
??delta=simu_game_once(dWinPossiblity,iCheckRange,iUpDownCondition,iGameTime );
??Counter[delta]++;
?}
?printf("up: %d ,down: %d ,keep: %d\n",
??Counter[UP],
??Counter[DOWN],
??Counter[KEEP]
??
;
?
?return 0;
}