《魔兽世界》的随机数值是如何在程序中处理的呢?请阅读问题补充?

p 为等价概率, a 为真实概率.

首次触发概率为 a , 第 k 次触发概率是 ak , ak 大于 1 时必定触发.

那么可以导出如下关系:

p(a)=\frac{1}{E(a)} = - \sum _{i=1}^{\left\lfloor 1/a\right\rfloor +1} i^2 (-a)^i\left(\frac{a-1}{a}\right)_{i-1}

比如 p(0.0571)\approx0.2 , 也就是暴击因子 5.7\% 对应 20\% 的等价暴击率.

所以你举的这个数据是错的, 正确的可以查: Dota Wiki

p(a) 是个分段多项式, 而且除了0.5<a<1是分段单调的, 可以求它的反函数.


你想知道 25\% 等价概率对应多少真实概率, 一般精度要求不高直接插值就行了

但你要想求精确值, 这个就非常麻烦了, 你得解方程

E_4(a)=-96 a^4+194 a^3-127 a^2+30 a=\frac{1}{4}

解得 a\approx8.6456\% 才能有 p = 25\%

如果你要找 1\% 的等价概率就要解一个 100 次方程,…

这谁顶得住哇…..

这就要靠渐进分析了, 原式可以近似为:

p(a)\approx\frac{a+1}{e^{1/a} a^{\frac{1}{a}+1} \Gamma \left(2+\frac{1}{a},\frac{1}{a}\right)-a-2},0<a<\frac14

可我还是不能对这玩意儿求反函数啊….

所以现在的问题归结为分母部分如何近似计算, 核心在于下列式子[1]如何计算:

g(n)= e^n n^{-n} \Gamma (n+2,n), n>0

对于不完全 \Gamma 函数, 我们有如下渐近展开:

\Gamma(z, z) \sim z^{z-1} \mathrm{e}^{-z}\left( \sqrt{\frac{\pi}{2}} z^{\frac{1}{2}}-\frac{1}{3} +\frac{\sqrt{2 \pi}}{24 }z^{-\frac{1}{2}}-\frac{4}{135}z^{-1} +\frac{\sqrt{2 \pi}}{576}z^{-\frac{3}{2}}+\frac{8}{2835}z^{-2} +\cdots\right)

同时我们有以下递推关系:

 \Gamma (s+1,x)=s\Gamma (s,x)+x^{s}\mathrm {e} ^{-x}

然后带入递推展开得到:

\Gamma (n+2,n)=e^{-n}n^n(2 n+1) +(n+1) n \Gamma (n,n)

接着渐近展开代入 \Gamma (n,n) 得到:

g(n)\sim\sqrt{\frac{\pi }{2}} n^{3/2}+\frac{5}{3}n+\sqrt{\frac{169 \pi }{288}}n^{1/2}+\frac{2}{3}+\sqrt{\frac{\pi }{288}} n^{-1/2} + O(n^{-1})

最后代回去就可以获得 p(a) 的各阶近似:

\begin{aligned} p_1(a)\sim&\frac{6\sqrt{a}}{18\pi-2\sqrt{a}}\\ p_2(a)\sim&\frac{24}{\sqrt{2\pi}\left(\sqrt{a}+\frac{12}{\sqrt{a}}\right)-8}\\ p_3(a)\sim&\frac{1080\sqrt{a}}{\sqrt{2\pi}(45a+540)-\sqrt{a}(32 a+360)} \end{aligned}

然后求反函数, 得到 a(p) 的一阶近似:

a_1(p) = \frac{9 \pi  p^2}{2 (p+3)^2}

同理可得二阶近似, 令 k=\dfrac{16}{\pi}\left(\dfrac{3}{p}+1\right)^2-12 , 则:

a_2(p)=k-\sqrt{k^2-144}

这个公式非常精确, 误差小于千分之一.

p = 0.05 时解得 a = 0.003801700055191759 , 和精确值 a=0.003801658303553139 比较, 相对误差只有十万分之一.

来源:知乎 www.zhihu.com

作者:酱紫君

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。
点击下载

此问题还有 5 个回答,查看全部。
延伸阅读:
研究一款游戏的数值该如何着手?

如何反推一个游戏的战斗公式?