简介:PRD算法是war III 中的伪随机算法。是对各种概率型(比如暴击)攻击内置的算法。详细信息请自行查阅资料。
我们知道PRD算法中的公式为P(N) = N * C, 但是这个C的计算方法并没有什么地方提及
现将计算方法列在下面,因为这种算法是逼近期望概率,所以实际概率会与期望概率有极小的偏差。
我们知道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
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