PRD算法中的C计算方法

简介:PRD算法是war III 中的伪随机算法。是对各种概率型(比如暴击)攻击内置的算法。详细信息请自行查阅资料。

我们知道PRD算法中的公式为P(N) = N * C, 但是这个C的计算方法并没有什么地方提及

现将计算方法列在下面,因为这种算法是逼近期望概率,所以实际概率会与期望概率有极小的偏差。
 1 
 2  #include  " stdafx.h "
 3  #include  < cmath >
 4 
 5  double  PFromC( double  C) // 不断试验当前C对应的实际概率,用1/当前的数学期望值 得到当前概率
 6  {
 7       double  dCurP  =   0.0 ;
 8       double  dPreSuccessP  =   0.0 ;
 9       double  dPE  =   0 ;
10       int  nMaxFail  =  ceil( 1.0   /  C);
11       for  ( int  i  =   1 ; i  <=  nMaxFail;  ++ i)
12      {
13          dCurP  =  fmin( 1.0 , i  *  C)  *  ( 1   -  dPreSuccessP);
14          dPreSuccessP  +=  dCurP;
15          dPE  +=  i  *  dCurP;
16      }
17       return   1.0   /  dPE;
18  }
19 
20  double  CFromP( double  P)
21  {
22       double  dUp  =  P;
23       double  dLow  =   0.0 ;
24       double  dMid  =  P;
25       double  dPLast  =   1.0 ;
26       while  ( true )
27      {
28          dMid  =  (dUp  +  dLow)  /   2.0 ;
29           double  dPtested  =  PFromC(dMid); // 使用二分法,不断试验当前C对应的实际概率
30           if  (fabs(dPtested  -  dPLast)  <=   0.0 ) // 前后两次计算结果相同,说明到了逼近极限,不与P比较是因为有误差,可能永远无法再逼近
31               break ;
32           if  (dPtested  >  P)
33              dUp  =  dMid;
34           else
35              dLow  =  dMid;
36          dPLast  =  dPtested;
37          
38      }
39       return  dMid;
40  }
41 
42 
43 
44  int  main()
45  {
46       for  ( int  i  =   1 ; i  <=   100 ;  ++ i)
47      {
48           double  p  =  i  /   100.0 ;
49           double  C  =  CFromP(p);
50          printf( " PE=%lf  C=%lf\n " , p, C);
51      }
52       return   0 ;
53  }
54 

你可能感兴趣的:(PRD算法中的C计算方法)