Locations of visitors to this page

You Are Not Prepared!!

It won't kill you to make you stronger!

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 

posted on 2015-12-11 15:11 NWAO 阅读(3085) 评论(0)  编辑 收藏 引用 所属分类: 精进持戒


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

“你个近视眼为啥还不戴眼镜?” “世界这么污浊,我看那么清楚干什么。”

导航

<2015年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

统计

常用链接

留言簿

随笔分类

随笔档案

MY FRIENDS

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜