/******************************************************************
附一: 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;
}