目前计算伪随机概率C值的方法,一般是二分法。二分法是个非常讨厌的方法,因为虽然简单却麻烦,想算个稍微精确点的数,需要十分巨大的计算量。如果像高中时那样手动计算,真是要算到眼花。
本文给出了一个十分简单快捷的方法,来计算C值,无需编程,仅需一个excel表就行。
注:前面几段是本方法的理论依据证明,如果嫌字多,可以直接跳到"用Excel表算C值"那一部分开始看。不过如果你直接跳到那一段看,不一定能看懂,O(∩_∩)O哈哈~
伪随机概率简单介绍
我们拿dota白牛的被动晕来举例:17%概率重击。为什么不拿剑圣来举例?已经有人用剑圣算过了,我要是还用剑圣算,难免有借别人结论胡说八道的嫌疑。
白牛第1次重击的概率为c;
若白牛第1次未重击,则第2次重击概率为2c;
若白牛第2次未重击,则第3次重击概率为3c;
........
当nc≥1时,必定重击。
每次重击之后,下次攻击重击概率变为c。
算出重击次数的期望值=
从上面可以看出:伪随机概率中说的“17%概率”并不是真的每下攻击的重击概率都是17%,而是一个不断增加的概率,满足重击次数期望值为
数列的方法算C值
根据上面介绍,于是我们有了常规计算思路:
白牛第1下 就 重击的概率=c
白牛第2下 才 重击的概率=2c
白牛第3下 才 重击的概率=3c
.....
白牛第n下 才 重击的概率=nc
于是这个问题就转化为如下数列问题:
已知数列{
我们算出
不过可惜的是这个前n项和公式似乎无法算出。退一万步讲,就算可以算出,
二分法算伪随机概率C值
令
白牛第1下就重击概率
白牛第2下才重击概率
白牛第3下才重击概率
....
此时重击次数期望值E=1
所以c>0.0001。
取
所以c<0.15
取c=(0.0001+0.15)/2=0.07505,重复上面步骤得此时E<
取c=(0.0001+0.07505)/2
重复上述步骤......直到E非常接近
我就不算下去了,因为计算量太大了,总共可能要我算几百万个小数相乘啊,累!
接下来我介绍一个非常简便快捷的算C值的方法。
用EXCEL算C值
如下图:具体如何编辑Excel中各列单元格已经写在图中了。
我们改动F2单元格的数值,使得G2单元格接近17%,则F2单元格此时的数值即为C值。
例如:白牛的17%概率重击对应的C值就是0.04092
解释一下这个表格的意思:
F2单元格:表示C值。
在这里手动输入C值,使得G2单元格的数值满足你的精确度需求时,就是我们想要算的那个C值。
G2单元格:表示F2单元格对应C值的面板暴击概率。
说的很拗口,举个例子,相当于dota里白牛的“17%”。
A列:记录次数。
A2单元格数值为1。
从A3单元格开始,如果A列上一单元格为0,则当前单元格也为0。
如果A列上一单元格不为0,并且A列上一单元格<1/c,那么当前单元格为上一单元格+1。
如果A列上一单元格不为0,并且A列上一单元格≥1/c,那么当前单元格为0 。
为什么这样?因为在伪随机概率下,当前次数暴击的概率=当前次数*C,当当前次数的暴击概率≥1时,必定暴击。因此若上单元格≥1/c,那就说明上一次的暴击概率≥1,已经必定暴击了。
B列:记录当前次数的实际暴击概率。
实际暴击概率=当前次数*C值
C列:记录当前次数不暴击的实际概率。
不暴击的实际概率=1-实际暴击的概率
D列:记录首次暴击发生在当前次数的概率。
首次暴击发生在当前次数的意思是:之前所有次数不暴击、而当前次数暴击。也就是前面一段"数列法算C值"中的
伪随机概率的特点
1、dota里说白牛的重击概率是17%,但是实际上白牛第1下打出重击的概率只有4%。
运气再怎么差的人,25下也必定会触发被动晕,不过这种情况非常少见,只有50亿分之一。
2、伪随机概率下,在5-6下左右第一次出重击的几率最大。上来就重击或者10多下才重击的概率较小,迁就了玩家的错误认知。(没办法纠正玩家的思维,只能迁就他们的思维了)
而自然概率下,第1下第一次出重击的概率最大,往后越来越小。