上是中国十七地 发表于 2024-9-5 08:28:42

[PVE] 基于模拟计算的法师P3阶段BIS配装下法伤/暴击/急速的收益权重(8.2更新sims对比)

大家好,我是夜风入寒轩,在确认国服无法在ICC之前开启的情况下,亚服走起了
目前是个蓝绿紫弟弟法,以下仅供参考,欢迎讨论,如果自摸带番你非要杠,那就是你对

在TBC时期,我就鸟德的法伤、命中、暴击之间的关系做过一个详细的论证,详见:深入探究法术强度,命中,暴击相关收益
所以每次在讨论属性收益的时候,我们一定要明确一个基础观点:在给定的条件下,伤害与法伤/命中/暴击/急速这四个自变量的函数f(x,y,z)是一个多元多次方程的关系(假设满命中)。

什么意思呢,简单来说就是抛开当前属性谈收益就是耍流氓。你基础秒伤1000的时候,和基础秒伤10000的时候,这个关系是绝对不一样的。
另外一层意思就是,我们常用的1暴击=xx法伤,1急速=xx法伤,是一种比较模糊的表述方式,我在这儿给出比较明确的定义:即在当前属性下,在给定的战斗时间和环境中,提升1暴击属性带来的DPS提升=提升xx法伤带来的DPS提升,也就是意味着,任何属性换算的描述,没有基础属性作为前置,参考性均有待提高。

好了废话说完了进入正题
感谢[@desperadoxzg]的启发,我发现了我的代码bug,已更正数据。
先直奔主题说结论:

在一个3分钟、纯木桩、法系满配、自己P3毕业的条件下,属性收益如下:
1急速≈0.8779法伤0.9071法伤;
1暴击≈0.8004法伤0.8826法伤;
1精神≈0.6779法伤0.7476法伤。
(啊为什么不算命中?别想了堆满就是了)


对sims的结果我不发表意见,仅作为参考对照放在这里,相关参数是按照我的假设调整的。

也就是说:
装备每带一个蓝孔,你就把他的奖励-4.32减去3.5法伤;
每带一个黄孔,你就把他的奖励-2.22减去1.93法伤;
然后计算下来如果奖励为正,就按颜色插,否则插23法伤。
这也是本文为数不多的实用价值吧。
该属性仅供参考,另还有一些大众接受但目前无数学验证的经验包括但不限于移动战暴击收益增加,战斗时间拉长急速收益增加等等~

一、计算方法
根据前面的一堆废话,我们知道,只要给定了假设条件,模拟战斗流程,模拟个几百万次,不就能知道分布和期望了。
那在这个基础上,我把模拟条件+1法伤/+1暴击/+1急速,不就可以得到这三者的不同收益了吗?
那剩下的不就简单了——模拟嘛。。

二、模拟条件
战斗时间:3分钟(以最后一个技能结束后t>180为判断依据)
天      赋:标准20/51折磨火
装      备:参考WLK折磨火P3阶段装备评分及BIS推荐配装分析,插1颗命中宝石保证满命中,红色23法伤,黄色法伤暴击,蓝色法伤精神,饰品258亡统+天堂
专业技能:工程+裁缝(无三布BUFF)
团队BUFF:法系满配,互换专注,恶魔术法伤假设500,无灌注,无德莱尼
其他假设:蓝量充足,纯木桩无其他任何干扰
输出方式:
1、无炸弹dot,触发连击,打炎爆;
2、无炸弹dot,未触发连击,上炸弹;
3、有炸弹dot,触发连击,打炎爆;
4、有炸弹dot,未触发连击,打火球;
5、离战斗结束时间<12,不再上炸弹;
6、起手偷加速预读火球→挂炸弹→开分身→开燃烧+手套+嗜血,读火球进入正常循环;
7、手套好了就开第二次;
8、第三次手套和狂暴以及第二瓶加速等斩杀期触发天堂开启,如战斗时间超过160秒未触发天堂,直接开启;

三、模拟代码
对我计算机二级都没过,我只保证正确性,不保证代码的简洁性


Numoftime=10000;
total=zeros(1,25*Numoftime);
total10sp=zeros(1,25*Numoftime);
total10hs=zeros(1,25*Numoftime);
total10cr=zeros(1,25*Numoftime);
tnumofhq1=zeros(1,25*Numoftime);
t10spnumofhq1=zeros(1,25*Numoftime);
t10hsnumofhq1=zeros(1,25*Numoftime);
t10crnumofhq1=zeros(1,25*Numoftime);
tnumofhq2=zeros(1,25*Numoftime);
t10spnumofhq2=zeros(1,25*Numoftime);
t10hsnumofhq2=zeros(1,25*Numoftime);
t10crnumofhq2=zeros(1,25*Numoftime);
tnumofyb1=zeros(1,25*Numoftime);
t10spnumofyb1=zeros(1,25*Numoftime);
t10hsnumofyb1=zeros(1,25*Numoftime);
t10crnumofyb1=zeros(1,25*Numoftime);
tnumofyb2=zeros(1,25*Numoftime);
t10spnumofyb2=zeros(1,25*Numoftime);
t10hsnumofyb2=zeros(1,25*Numoftime);
t10crnumofyb2=zeros(1,25*Numoftime);
tnumofzd1=zeros(1,25*Numoftime);
t10spnumofzd1=zeros(1,25*Numoftime);
t10hsnumofzd1=zeros(1,25*Numoftime);
t10crnumofzd1=zeros(1,25*Numoftime);
tnumofzd2=zeros(1,25*Numoftime);
t10spnumofzd2=zeros(1,25*Numoftime);
t10hsnumofzd2=zeros(1,25*Numoftime);
t10crnumofzd2=zeros(1,25*Numoftime);
for j=1:100*Numoftime
if j<=25*Numoftime
    Sp=3616;%团队下最终法伤
    Haste=0.2942;%团队下最终急速1.5/
    Crit=0.7028;%团队下最终暴击
end
if j>25*Numoftime
    if j<=50*Numoftime
    Sp=3616+10;%团队下最终法伤
    Haste=0.2942;%团队下最终急速
    Crit=0.7028;%团队下最终暴击
    end
end
if j>50*Numoftime
    if j<=75*Numoftime
    Sp=3616;%团队下最终法伤
    Haste=0.2942+10/3279;%团队下最终急速
    Crit=0.7028;%团队下最终暴击
    end
end
if j>75*Numoftime
    if j<=100*Numoftime
    Sp=3616;%团队下最终法伤
    Haste=0.2942;%团队下最终急速
    Crit=0.7028+10/4591;%团队下最终暴击
    end
end
T=240;%战斗时间
t0=0.00;%起始时间
%基础属性
Hit=1;
%起始值
%统计的2为暴击,主程序的2为斩杀,备注区别
numofhq1=0;%火球技能数量
numofhq2=0;%火球技能数量(暴击)
numofyb1=0;%炎爆技能数量
numofyb2=0;%炎爆技能数量(暴击)
numofzd1=0;%活动炸弹技能数量
numofzd2=0;%活动炸弹技能数量(暴击)
Damage=0;%总伤害
Dfs=18001;%镜像伤害
Rhaste=Haste;%当前急速
Rsp=Sp;%当前法强
Rcrit=Crit;%当前暴击
t=t0;%当前时间
fslj=0;%法术连击
%爆发技能
%嗜血:1次,持续时间40秒,35%急速
%饰品1:168法强,特效3分钟约4W8伤害
%饰品2:135暴击,触发959法强,持续时间10秒,内置CD45s,触发率10%
%狂暴:CD120秒,持续时间10秒,急速+20%
%手套:CD60秒,持续12秒,急速+340
%披风:触发295法强,持续15秒,内置CD60s,触发率20%
%加速:500急速,持续15秒
%狂野:200法强,200暴击,持续15秒
%2T9:火甲基础暴击提升
%4T9:火球术5暴击
buff00=-360;%嗜血持续时间
buff1=-360;%起手偷加速持续时间
buff12=-360;%第二瓶加速持续时间
buff2=0;%触发饰品CD
buff22=-360;%触发饰品持续时间
buff3=0;%亮纹刺绣CD
buff33=-360;%亮纹刺绣持续时间
buff7=-360;%狂暴CD
buff77=-360;%狂暴持续时间
buff8=-360;%手套CD
buff88=-360;%手套持续时间
tofzd=-360;%炸弹持续时间
numofrs=-360;%燃烧层数
for i=1:240
    %起手偷速度药水13秒
    if i==1
      Rhaste=Haste+500/32.79/100;
      buff1=0;%起手药水持续时间
    end
    if buff1>12
      buff1=-360;
      Rhaste=((1+Rhaste)/1.3-500/32.79/100)*1.3-1;%嗜血期间第一瓶速度药水
    end
   
      %一键爆发及BUFF消失
    if i==4
      Rhaste=(1+Rhaste+340/32.79/100)*1.3-1;
      buff00=0;
      buff88=0;
      buff8=-60;
      numofrs=3;
      Rcrit=Rcrit+0.1;
      if Rcrit>1
            Rcrit=1;
      end
    end
   
    if numofrs>0
      Rcrit=Rcrit+0.1;
    else
      if numofrs==0
            Rcrit=Crit;
      end
    end

    if buff77>10
      buff77=-360;
      Rhaste=(1+Rhaste)/1.2-1;
    end
    if buff88>12
      buff88=-360;
            if buff00>0
                if buff77>0
                  Rhaste=((1+Rhaste)/1.3/1.2-340/32.79/100)*1.2*1.3-1;
                else
                  Rhaste=((1+Rhaste)/1.3-340/32.79/100)*1.3-1;
                end
            else
                if buff77>0
                  Rhaste=((1+Rhaste)/1.2-340/32.79/100)*1.2-1;
                else
                  Rhaste=Rhaste-340/32.79/100;
                end
            end
    end
    if buff00>40
      buff00=-360;
      Rhaste=(1+Rhaste)/1.3-1;
    end
   
    %第二轮爆发(斩杀期带狂暴速度药水)
    if t>117   %第一波手套4秒后开,第二波手套好了就开,第三波等斩杀开(假设117秒进斩)
      if buff2>0%天堂触发
            if buff8>0%手套冷却好
                Rhaste=(1+Rhaste+840/32.79/100)*1.2-1;
                buff12=0;
                buff77=0;
                buff7=-180;
                buff88=0;
                buff8=-60;
                numofrs=3;
                Rcrit=Rcrit+0.1;
                if Rcrit>1
                  Rcrit=1;
                end
            end
      else
            if t>160 %天堂未触发,最后15秒战斗,开手套+狂暴
                if buff8>0
                  Rhaste=(1+Rhaste+840/32.79/100)*1.2-1;
                  buff12=0;
                  buff77=0;
                  buff7=-180;
                  buff88=0;
                  buff8=-60;
                  numofrs=3;
                  Rcrit=Rcrit+0.1;
                  if Rcrit>1
                        Rcrit=1;
                  end
                end
            end
      end
    end
      
    if t>60
      if t<117
            if buff8>0
                Rhaste=Rhaste+340/32.79/100;
                buff88=0;
                buff8=-60;
            end
      end
    end
   
    %第二瓶加速药水消失
    if buff12>15
      buff12=-360;
      Rhaste=Rhaste-500/32.79/100;
    end

    %施法时间   
    Ctofhq=2.85/(1+Rhaste);%火球施法时间
    Ctofgcd=1.5/(1+Rhaste);%GCD
    if Ctofhq<1
      Ctofhq=1;
    end
    if Ctofgcd<1
      Ctofgcd=1;
    end
   
    %技能伤害
    Dhq1=(randi()+Rsp+0.15*Rsp)*1.06*1.12*1.03*1.1;
    Dhq2=(randi()+Rsp+0.15*Rsp)*1.06*1.12*1.03*1.1*1.12; %斩杀期
    Dyb1=(randi()+1.15*Rsp+0.15*Rsp)*1.12*1.03*1.1;
    Dyb2=(randi()+1.15*Rsp+0.15*Rsp)*1.12*1.03*1.1*1.12;
    Dzddot1=(1380+Rsp*12/15)*1.03*1.1;
    Dzddot2=(1380+Rsp*12/15)*1.03*1.1*1.12;
    Dzd1=(690+Rsp*0.4)*1.03*1.1;         %变强反馈系数0.4
    Dzd2=(690+Rsp*0.4)*1.03*1.1*1.12;
   
    %判断暴击
    cr=rand();
    if cr<Rcrit+0.08
    Dhq1=Dhq1*1.8175*1.4;
    Dhq2=Dhq2*1.8175*1.4;
    end
    if cr<Rcrit+0.06
    Dyb1=Dyb1*1.8175*1.4;
    Dyb2=Dyb2*1.8175*1.4;
    Dzddot1=Dzddot1*1.8175*1.4;
    Dzddot2=Dzddot2*1.8175*1.4;
    Dzd1=Dzd1*1.8175*1.4;
    Dzd2=Dzd2*1.8175*1.4;
    end
   
    %出伤
    %起手
    if i==1
      Damage=Damage+Dhq1;
      if cr<Rcrit+0.08
            numofhq2=numofhq2+1;
      else
            numofhq1=numofhq1+1;
      end
      if cr<Rcrit+0.08
            fslj=fslj+1;
      else
            fslj=0;
      end
      t=1;
      
      %判断被动饰品
            if buff2==0 %被动饰品冷却好了
                if rand()<0.1
                  buff2=-45;
                  buff22=0;
                  Rsp=Rsp+959;
                end
            end
            if buff2<0 %被动饰品冷却中
                buff2=buff2+Ctofgcd;
            else
                buff2=0;%被动饰品冷却好了
            end
            if buff22>10 %被动饰品持续时间结束
                buff22=-360;
                Rsp=Rsp-959;
            else
                if buff22>-1
                  buff22=buff22+Ctofgcd;
                end
            end
            %判断被动饰品
            
             %判断亮纹刺绣
            if buff3==0 %亮纹刺绣冷却好了
                if rand()<0.67232
                  buff3=-60;
                  buff33=0;
                  Rsp=Rsp+295;
                end
            end
            if buff3<0 %亮纹刺绣冷却中
                buff3=buff3+Ctofgcd;
            else
                buff3=0;%亮纹刺绣冷却好了
            end
            if buff33>15 %亮纹刺绣持续时间结束
                buff33=-1;
                Rsp=Rsp-295;
            else
                if buff33>-1
                  buff33=buff33+Ctofgcd;
                end
            end
            %判断亮纹刺绣
    end
   
    if i==2
      Damage=Damage+Dzddot1;
      if cr<Rcrit+0.06
            numofzd2=numofzd2+1;
      else
            numofzd1=numofzd1+1;
      end
      tofzd=Ctofgcd;
      t=t+Ctofgcd;
      %判断被动饰品
            if buff2==0 %被动饰品冷却好了
                if rand()<0.1
                  buff2=-45;
                  buff22=0;
                  Rsp=Rsp+959;
                end
            end
            if buff2<0 %被动饰品冷却中
                buff2=buff2+Ctofgcd;
            else
                buff2=0;%被动饰品冷却好了
            end
            if buff22>10 %被动饰品持续时间结束
                buff22=-360;
                Rsp=Rsp-959;
            else
                if buff22>-1
                  buff22=buff22+Ctofgcd;
                end
            end
            %判断被动饰品
            
             %判断亮纹刺绣
            if buff3==0 %亮纹刺绣冷却好了
                if rand()<0.67232
                  buff3=-60;
                  buff33=0;
                  Rsp=Rsp+295;
                end
            end
            if buff3<0 %亮纹刺绣冷却中
                buff3=buff3+Ctofgcd;
            else
                buff3=0;%亮纹刺绣冷却好了
            end
            if buff33>15 %亮纹刺绣持续时间结束
                buff33=-1;
                Rsp=Rsp-295;
            else
                if buff33>-1
                  buff33=buff33+Ctofgcd;
                end
            end
            %判断亮纹刺绣
    end
   
    if i==3
      Damage=Damage+Dfs;
      tofzd=tofzd+Ctofgcd;
      t=t+Ctofgcd;
      %判断被动饰品
            if buff2==0 %被动饰品冷却好了
                if rand()<0.1
                  buff2=-45;
                  buff22=0;
                  Rsp=Rsp+959;
                end
            end
            if buff2<0 %被动饰品冷却中
                buff2=buff2+Ctofgcd;
            else
                buff2=0;%被动饰品冷却好了
            end
            if buff22>10 %被动饰品持续时间结束
                buff22=-360;
                Rsp=Rsp-959;
            else
                if buff22>-1
                  buff22=buff22+Ctofgcd;
                end
            end
            %判断被动饰品
            
             %判断亮纹刺绣
            if buff3==0 %亮纹刺绣冷却好了
                if rand()<0.67232
                  buff3=-60;
                  buff33=0;
                  Rsp=Rsp+295;
                end
            end
            if buff3<0 %亮纹刺绣冷却中
                buff3=buff3+Ctofgcd;
            else
                buff3=0;%亮纹刺绣冷却好了
            end
            if buff33>15 %亮纹刺绣持续时间结束
                buff33=-1;
                Rsp=Rsp-295;
            else
                if buff33>-1
                  buff33=buff33+Ctofgcd;
                end
            end
            %判断亮纹刺绣
    end
   
    if i==4
      Damage=Damage+Dhq1;
      if cr<Rcrit+0.08
            numofhq2=numofhq2+1;
      else
            numofhq1=numofhq1+1;
      end
      if cr<Rcrit+0.08
            fslj=fslj+1;
      else
            fslj=0;
      end
      tofzd=tofzd+Ctofhq;
      t=t+Ctofhq;
      %判断被动饰品
            if buff2==0 %被动饰品冷却好了
                if rand()<0.1
                  buff2=-45;
                  buff22=0;
                  Rsp=Rsp+959;
                end
            end
            if buff2<0 %被动饰品冷却中
                buff2=buff2+Ctofgcd;
            else
                buff2=0;%被动饰品冷却好了
            end
            if buff22>10 %被动饰品持续时间结束
                buff22=-360;
                Rsp=Rsp-959;
            else
                if buff22>-1
                  buff22=buff22+Ctofgcd;
                end
            end
            %判断被动饰品
            
             %判断亮纹刺绣
            if buff3==0 %亮纹刺绣冷却好了
                if rand()<0.67232
                  buff3=-60;
                  buff33=0;
                  Rsp=Rsp+295;
                end
            end
            if buff3<0 %亮纹刺绣冷却中
                buff3=buff3+Ctofgcd;
            else
                buff3=0;%亮纹刺绣冷却好了
            end
            if buff33>15 %亮纹刺绣持续时间结束
                buff33=-1;
                Rsp=Rsp-295;
            else
                if buff33>-1
                  buff33=buff33+Ctofgcd;
                end
            end
            %判断亮纹刺绣
    end
   
    %常规输出
    if i>4
    if tofzd>12;
      if t<117
            Damage=Damage+Dzd1;%(1)炸弹CD好了,伤害+炸弹爆炸伤害
            %判断燃烧
            if cr<Rcrit+0.06
                numofrs=numofrs-1;
            end
            %判断燃烧
      else
            Damage=Damage+Dzd2;%(1)炸弹CD好了,伤害+炸弹爆炸伤害(斩杀)
            %判断燃烧
            if cr<Rcrit+0.06
                numofrs=numofrs-1;
            end
            %判断燃烧
      end
      %法术连击
      if cr<Rcrit+0.06
            fslj=fslj+1;
      else
            fslj=0;
      end
      tofzd=0;
    end
    if tofzd==0
      if fslj>=2
            if t<117
                Damage=Damage+Dyb1;%(2)炸弹CD好了,触发连击,伤害+炎爆伤害
                if cr<Rcrit+0.06
                  numofyb2=numofyb2+1;
                else
                  numofyb1=numofyb1+1;
                end
                %判断燃烧
                if cr<Rcrit+0.06
                  numofrs=numofrs-1;
                end
                %判断燃烧
                t=t+Ctofgcd;
                buff1=buff1+Ctofgcd;%加速药水时间
                buff12=buff12+Ctofgcd;%加速药水2时间
                buff77=buff77+Ctofgcd;%狂暴持续时间
                buff7=buff7+Ctofgcd;%暴冷却时间
                buff88=buff88+Ctofgcd;%手套持续时间
                buff8=buff8+Ctofgcd;%手套冷却时间
                buff00=buff00+Ctofgcd;%嗜血时间
                fslj=fslj-2;
                        
            %判断被动饰品
            if buff2==0 %被动饰品冷却好了
                if rand()<0.1
                  buff2=-45;
                  buff22=0;
                  Rsp=Rsp+959;
                end
            end
            if buff2<0 %被动饰品冷却中
                buff2=buff2+Ctofgcd;
            else
                buff2=0;%被动饰品冷却好了
            end
            if buff22>10 %被动饰品持续时间结束
                buff22=-360;
                Rsp=Rsp-959;
            else
                if buff22>-1
                  buff22=buff22+Ctofgcd;
                end
            end
            %判断被动饰品
            
             %判断亮纹刺绣
            if buff3==0 %亮纹刺绣冷却好了
                if rand()<0.67232
                  buff3=-60;
                  buff33=0;
                  Rsp=Rsp+295;
                end
            end
            if buff3<0 %亮纹刺绣冷却中
                buff3=buff3+Ctofgcd;
            else
                buff3=0;%亮纹刺绣冷却好了
            end
            if buff33>15 %亮纹刺绣持续时间结束
                buff33=-1;
                Rsp=Rsp-295;
            else
                if buff33>-1
                  buff33=buff33+Ctofgcd;
                end
            end
            %判断亮纹刺绣
            
            else
                Damage=Damage+Dyb2;%(2)炸弹CD好了,触发连击,伤害+炎爆伤害(斩杀)
                if cr<Rcrit+0.06
                  numofyb2=numofyb2+1;
                else
                  numofyb1=numofyb1+1;
                end
                %判断燃烧
                if cr<Rcrit+0.06
                  numofrs=numofrs-1;
                end
                %判断燃烧
                t=t+Ctofgcd;
                buff1=buff1+Ctofgcd;%加速药水时间
                buff12=buff12+Ctofgcd;%加速药水2时间
                buff77=buff77+Ctofgcd;%狂暴持续时间
                buff7=buff7+Ctofgcd;%暴冷却时间
                buff88=buff88+Ctofgcd;%手套持续时间
                buff8=buff8+Ctofgcd;%手套冷却时间
                buff00=buff00+Ctofgcd;%嗜血时间
                fslj=fslj-2;
                                       
            %判断被动饰品
            if buff2==0 %被动饰品冷却好了
                if rand()<0.1
                  buff2=-45;
                  buff22=0;
                  Rsp=Rsp+959;
                end
            end
            if buff2<0 %被动饰品冷却中
                buff2=buff2+Ctofgcd;
            else
                buff2=0;%被动饰品冷却好了
            end
            if buff22>10 %被动饰品持续时间结束
                buff22=-360;
                Rsp=Rsp-959;
            else
                if buff22>-1
                  buff22=buff22+Ctofgcd;
                end
            end
            %判断被动饰品
            
             %判断亮纹刺绣
            if buff3==0 %亮纹刺绣冷却好了
                if rand()<0.67232
                  buff3=-60;
                  buff33=0;
                  Rsp=Rsp+295;
                end
            end
            if buff3<0 %亮纹刺绣冷却中
                buff3=buff3+Ctofgcd;
            else
                buff3=0;%亮纹刺绣冷却好了
            end
            if buff33>15 %亮纹刺绣持续时间结束
                buff33=-1;
                Rsp=Rsp-295;
            else
                if buff33>-1
                  buff33=buff33+Ctofgcd;
                end
            end
            %判断亮纹刺绣
            
            end
      else
          if t<168
            if t<117
                Damage=Damage+Dzddot1;%(3)炸弹CD好了,未触发连击,伤害+炸弹dot伤害
                if cr<Rcrit+0.06
                  numofzd2=numofzd2+1;
                else
                  numofzd1=numofzd1+1;
                end
                t=t+Ctofgcd;
                tofzd=Ctofgcd;
                buff1=buff1+Ctofgcd;%加速药水时间
                buff12=buff12+Ctofgcd;%加速药水2时间
                buff77=buff77+Ctofgcd;%狂暴持续时间
                buff7=buff7+Ctofgcd;%暴冷却时间
                buff88=buff88+Ctofgcd;%手套持续时间
                buff8=buff8+Ctofgcd;%手套冷却时间
                buff00=buff00+Ctofgcd;%嗜血时间
                                    
            %判断被动饰品
            if buff2==0 %被动饰品冷却好了
                if rand()<0.1
                  buff2=-45;
                  buff22=0;
                  Rsp=Rsp+959;
                end
            end
            if buff2<0 %被动饰品冷却中
                buff2=buff2+Ctofgcd;
            else
                buff2=0;%被动饰品冷却好了
            end
            if buff22>10 %被动饰品持续时间结束
                buff22=-360;
                Rsp=Rsp-959;
            else
                if buff22>-1
                  buff22=buff22+Ctofgcd;
                end
            end
            %判断被动饰品
            
             %判断亮纹刺绣
            if buff3==0 %亮纹刺绣冷却好了
                if rand()<0.67232
                  buff3=-60;
                  buff33=0;
                  Rsp=Rsp+295;
                end
            end
            if buff3<0 %亮纹刺绣冷却中
                buff3=buff3+Ctofgcd;
            else
                buff3=0;%亮纹刺绣冷却好了
            end
            if buff33>15 %亮纹刺绣持续时间结束
                buff33=-1;
                Rsp=Rsp-295;
            else
                if buff33>-1
                  buff33=buff33+Ctofgcd;
                end
            end
            %判断亮纹刺绣
            
            else
                Damage=Damage+Dzddot2;%(3)炸弹CD好了,未触发连击,伤害+炸弹dot伤害(斩杀)
                if cr<Rcrit+0.06
                  numofzd2=numofzd2+1;
                else
                  numofzd1=numofzd1+1;
                end
                t=t+Ctofgcd;
                tofzd=Ctofgcd;
                buff1=buff1+Ctofgcd;%加速药水时间
                buff12=buff12+Ctofgcd;%加速药水2时间
                buff77=buff77+Ctofgcd;%狂暴持续时间
                buff7=buff7+Ctofgcd;%暴冷却时间
                buff88=buff88+Ctofgcd;%手套持续时间
                buff8=buff8+Ctofgcd;%手套冷却时间
                buff00=buff00+Ctofgcd;%嗜血时间
                                       
            %判断被动饰品
            if buff2==0 %被动饰品冷却好了
                if rand()<0.1
                  buff2=-45;
                  buff22=0;
                  Rsp=Rsp+959;
                end
            end
            if buff2<0 %被动饰品冷却中
                buff2=buff2+Ctofgcd;
            else
                buff2=0;%被动饰品冷却好了
            end
            if buff22>10 %被动饰品持续时间结束
                buff22=-360;
                Rsp=Rsp-959;
            else
                if buff22>-1
                  buff22=buff22+Ctofgcd;
                end
            end
            %判断被动饰品
            
             %判断亮纹刺绣
            if buff3==0 %亮纹刺绣冷却好了
                if rand()<0.67232
                  buff3=-60;
                  buff33=0;
                  Rsp=Rsp+295;
                end
            end
            if buff3<0 %亮纹刺绣冷却中
                buff3=buff3+Ctofgcd;
            else
                buff3=0;%亮纹刺绣冷却好了
            end
            if buff33>15 %亮纹刺绣持续时间结束
                buff33=-1;
                Rsp=Rsp-295;
            else
                if buff33>-1
                  buff33=buff33+Ctofgcd;
                end
            end
            %判断亮纹刺绣
            
            end
          else
            Damage=Damage+Dhq2;%(4)炸弹CD好了,未触发连击,剩余时间小于12秒,伤害+火球伤害(斩杀)
            if cr<Rcrit+0.08
                  numofhq2=numofhq2+1;
            else
                  numofhq1=numofhq1+1;
            end
            %判断燃烧
            if cr<Rcrit+0.08
                  numofrs=numofrs-1;
            end
            %判断燃烧
            t=t+Ctofhq;
            tofzd=0;
            tofzd=tofzd+Ctofhq;
            buff1=buff1+Ctofhq;%加速药水时间
            buff12=buff12+Ctofhq;%加速药水2时间
            buff77=buff77+Ctofhq;%狂暴持续时间
            buff7=buff7+Ctofhq;%暴冷却时间
            buff88=buff88+Ctofhq;%手套持续时间
            buff8=buff8+Ctofhq;%手套冷却时间
            buff00=buff00+Ctofhq;%嗜血时间
            if cr<Rcrit+0.08
                  fslj=fslj+1;
            else
                  fslj=0;
            end
                                    
            %判断被动饰品
            if buff2==0 %被动饰品冷却好了
                if rand()<0.1
                  buff2=-45;
                  buff22=0;
                  Rsp=Rsp+959;
                end
            end
            if buff2<0 %被动饰品冷却中
                buff2=buff2+Ctofhq;
            else
                buff2=0;%被动饰品冷却好了
            end
            if buff22>10 %被动饰品持续时间结束
                buff22=-360;
                Rsp=Rsp-959;
            else
                if buff22>-1
                  buff22=buff22+Ctofhq;
                end
            end
            %判断被动饰品
            
             %判断亮纹刺绣
            if buff3==0 %亮纹刺绣冷却好了
                if rand()<0.67232
                  buff3=-60;
                  buff33=0;
                  Rsp=Rsp+295;
                end
            end
            if buff3<0 %亮纹刺绣冷却中
                buff3=buff3+Ctofhq;
            else
                buff3=0;%亮纹刺绣冷却好了
            end
            if buff33>15 %亮纹刺绣持续时间结束
                buff33=-1;
                Rsp=Rsp-295;
            else
                if buff33>-1
                  buff33=buff33+Ctofhq;
                end
            end
            %判断亮纹刺绣
            
          end
      end
    else
      if fslj>=2
            if t<117
                Damage=Damage+Dyb1;%(5)炸弹CD没好,触发连击,伤害+炎爆伤害
                if cr<Rcrit+0.06
                  numofyb2=numofyb2+1;
                else
                  numofyb1=numofyb1+1;
                end
                %判断燃烧
                if cr<Rcrit+0.06
                  numofrs=numofrs-1;
                end
                %判断燃烧
                t=t+Ctofgcd;
                tofzd=tofzd+Ctofgcd;
                buff1=buff1+Ctofgcd;%加速药水时间
                buff12=buff12+Ctofgcd;%加速药水2时间
                buff77=buff77+Ctofgcd;%狂暴持续时间
                buff7=buff7+Ctofgcd;%暴冷却时间
                buff88=buff88+Ctofgcd;%手套持续时间
                buff8=buff8+Ctofgcd;%手套冷却时间
                buff00=buff00+Ctofgcd;%嗜血时间
                fslj=fslj-2;
                                          
            %判断被动饰品
            if buff2==0 %被动饰品冷却好了
                if rand()<0.1
                  buff2=-45;
                  buff22=0;
                  Rsp=Rsp+959;
                end
            end
            if buff2<0 %被动饰品冷却中
                buff2=buff2+Ctofgcd;
            else
                buff2=0;%被动饰品冷却好了
            end
            if buff22>10 %被动饰品持续时间结束
                buff22=-360;
                Rsp=Rsp-959;
            else
                if buff22>-1
                  buff22=buff22+Ctofgcd;
                end
            end
            %判断被动饰品
            
             %判断亮纹刺绣
            if buff3==0 %亮纹刺绣冷却好了
                if rand()<0.67232
                  buff3=-60;
                  buff33=0;
                  Rsp=Rsp+295;
                end
            end
            if buff3<0 %亮纹刺绣冷却中
                buff3=buff3+Ctofgcd;
            else
                buff3=0;%亮纹刺绣冷却好了
            end
            if buff33>15 %亮纹刺绣持续时间结束
                buff33=-1;
                Rsp=Rsp-295;
            else
                if buff33>-1
                  buff33=buff33+Ctofgcd;
                end
            end
            %判断亮纹刺绣
            
            else
                Damage=Damage+Dyb2;%(5)炸弹CD没好,触发连击,伤害+炎爆伤害(斩杀)
                if cr<Rcrit+0.06
                  numofyb2=numofyb2+1;
                else
                  numofyb1=numofyb1+1;
                end
                %判断燃烧
                if cr<Rcrit+0.06
                  numofrs=numofrs-1;
                end
                %判断燃烧
                t=t+Ctofgcd;
                tofzd=tofzd+Ctofgcd;
                buff1=buff1+Ctofgcd;%加速药水时间
                buff12=buff12+Ctofgcd;%加速药水2时间
                buff77=buff77+Ctofgcd;%狂暴持续时间
                buff7=buff7+Ctofgcd;%暴冷却时间
                buff88=buff88+Ctofgcd;%手套持续时间
                buff8=buff8+Ctofgcd;%手套冷却时间
                buff00=buff00+Ctofgcd;%嗜血时间
                fslj=fslj-2;
                                       
            %判断被动饰品
            if buff2==0 %被动饰品冷却好了
                if rand()<0.1
                  buff2=-45;
                  buff22=0;
                  Rsp=Rsp+959;
                end
            end
            if buff2<0 %被动饰品冷却中
                buff2=buff2+Ctofgcd;
            else
                buff2=0;%被动饰品冷却好了
            end
            if buff22>10 %被动饰品持续时间结束
                buff22=-360;
                Rsp=Rsp-959;
            else
                if buff22>-1
                  buff22=buff22+Ctofgcd;
                end
            end
            %判断被动饰品
            
             %判断亮纹刺绣
            if buff3==0 %亮纹刺绣冷却好了
                if rand()<0.67232
                  buff3=-60;
                  buff33=0;
                  Rsp=Rsp+295;
                end
            end
            if buff3<0 %亮纹刺绣冷却中
                buff3=buff3+Ctofgcd;
            else
                buff3=0;%亮纹刺绣冷却好了
            end
            if buff33>15 %亮纹刺绣持续时间结束
                buff33=-1;
                Rsp=Rsp-295;
            else
                if buff33>-1
                  buff33=buff33+Ctofgcd;
                end
            end
            %判断亮纹刺绣
            
            end
      else
            if t<117
                Damage=Damage+Dhq1;%(6)炸弹CD没好,未触发连击,伤害+火球伤害
                if cr<Rcrit+0.08
                  numofhq2=numofhq2+1;
                else
                  numofhq1=numofhq1+1;
                end
                if cr<Rcrit+0.08
                  numofrs=numofrs-1;
                end
                %判断燃烧
                t=t+Ctofhq;
                tofzd=tofzd+Ctofhq;
                buff1=buff1+Ctofhq;%加速药水时间
                buff12=buff12+Ctofhq;%加速药水2时间
                buff77=buff77+Ctofhq;%狂暴持续时间
                buff7=buff7+Ctofhq;%暴冷却时间
                buff88=buff88+Ctofhq;%手套持续时间
                buff8=buff8+Ctofhq;%手套冷却时间
                buff00=buff00+Ctofhq;%嗜血时间
                if cr<Rcrit+0.08
                  fslj=fslj+1;
                else
                  fslj=0;
                end
                           
            %判断被动饰品
            if buff2==0 %被动饰品冷却好了
                if rand()<0.1
                  buff2=-45;
                  buff22=0;
                  Rsp=Rsp+959;
                end
            end
            if buff2<0 %被动饰品冷却中
                buff2=buff2+Ctofhq;
            else
                buff2=0;%被动饰品冷却好了
            end
            if buff22>10 %被动饰品持续时间结束
                buff22=-360;
                Rsp=Rsp-959;
            else
                if buff22>-1
                  buff22=buff22+Ctofhq;
                end
            end
            %判断被动饰品
            
             %判断亮纹刺绣
            if buff3==0 %亮纹刺绣冷却好了
                if rand()<0.67232
                  buff3=-60;
                  buff33=0;
                  Rsp=Rsp+295;
                end
            end
            if buff3<0 %亮纹刺绣冷却中
                buff3=buff3+Ctofhq;
            else
                buff3=0;%亮纹刺绣冷却好了
            end
            if buff33>15 %亮纹刺绣持续时间结束
                buff33=-1;
                Rsp=Rsp-295;
            else
                if buff33>-1
                  buff33=buff33+Ctofhq;
                end
            end
            %判断亮纹刺绣
            
            else
                Damage=Damage+Dhq2;%(6)炸弹CD没好,未触发连击,伤害+火球伤害(斩杀)
                if cr<Rcrit+0.08
                  numofhq2=numofhq2+1;
                else
                  numofhq1=numofhq1+1;
                end
                if cr<Rcrit+0.08
                  numofrs=numofrs-1;
                end
                %判断燃烧
                t=t+Ctofhq;
                tofzd=tofzd+Ctofhq;
                buff1=buff1+Ctofhq;%加速药水时间
                buff12=buff12+Ctofhq;%加速药水2时间
                buff77=buff77+Ctofhq;%狂暴持续时间
                buff7=buff7+Ctofhq;%暴冷却时间
                buff88=buff88+Ctofhq;%手套持续时间
                buff8=buff8+Ctofhq;%手套冷却时间
                buff00=buff00+Ctofhq;%嗜血时间
                if cr<Rcrit+0.08
                  fslj=fslj+1;
                else
                  fslj=0;
                end
                              
            %判断被动饰品
            if buff2==0 %被动饰品冷却好了
                if rand()<0.1
                  buff2=-45;
                  buff22=0;
                  Rsp=Rsp+959;
                end
            end
            if buff2<0 %被动饰品冷却中
                buff2=buff2+Ctofhq;
            else
                buff2=0;%被动饰品冷却好了
            end
            if buff22>10 %被动饰品持续时间结束
                buff22=-360;
                Rsp=Rsp-959;
            else
                if buff22>-1
                  buff22=buff22+Ctofhq;
                end
            end
            %判断被动饰品
            
             %判断亮纹刺绣
            if buff3==0 %亮纹刺绣冷却好了
                if rand()<0.67232
                  buff3=-60;
                  buff33=0;
                  Rsp=Rsp+295;
                end
            end
            if buff3<0 %亮纹刺绣冷却中
                buff3=buff3+Ctofhq;
            else
                buff3=0;%亮纹刺绣冷却好了
            end
            if buff33>15 %亮纹刺绣持续时间结束
                buff33=-1;
                Rsp=Rsp-295;
            else
                if buff33>-1
                  buff33=buff33+Ctofhq;
                end
            end
            %判断亮纹刺绣
            
            end
      end
    end
   end
   if t>182
   break
   end
end
dps=Damage*(1+0.032+0.025)/(t-2);%亡统特效:7250(2.5%),炎爆DOT:93300(3.2%),2023年7月20日世界第一HTOC1号数据

if j<=25*Numoftime
    total(1,j)=dps;
    tnumofhq1(1,j)=numofhq1;
    tnumofhq2(1,j)=numofhq2;
    tnumofyb1(1,j)=numofyb1;
    tnumofyb2(1,j)=numofyb2;
    tnumofzd1(1,j)=numofzd1;
    tnumofzd2(1,j)=numofzd2;
    if j==25*Numoftime
      Averagedps=mean(total);
      Averagenohq1=mean(tnumofhq1);
      Averagenohq2=mean(tnumofhq2);
      Averagenoyb1=mean(tnumofyb1);
      Averagenoyb2=mean(tnumofyb2);
      Averagenozd1=mean(tnumofzd1);
      Averagenozd2=mean(tnumofzd2);
    end
else
    if j<=50*Numoftime
      total10sp(1,j-25*Numoftime)=dps;
      t10spnumofhq1(1,j-25*Numoftime)=numofhq1;
      t10spnumofhq2(1,j-25*Numoftime)=numofhq2;
      t10spnumofyb1(1,j-25*Numoftime)=numofyb1;
      t10spnumofyb2(1,j-25*Numoftime)=numofyb2;
      t10spnumofzd1(1,j-25*Numoftime)=numofzd1;
      t10spnumofzd2(1,j-25*Numoftime)=numofzd2;
      if j==50*Numoftime
            Averagedps10sp=mean(total10sp);
            Average10spnohq1=mean(t10spnumofhq1);
            Average10spnohq2=mean(t10spnumofhq2);
            Average10spnoyb1=mean(t10spnumofyb1);
            Average10spnoyb2=mean(t10spnumofyb2);
            Average10spnozd1=mean(t10spnumofzd1);
            Average10spnozd2=mean(t10spnumofzd2);
      end
    else
      if j<=75*Numoftime
         total10hs(1,j-50*Numoftime)=dps;
         t10hsnumofhq1(1,j-50*Numoftime)=numofhq1;
         t10hsnumofhq2(1,j-50*Numoftime)=numofhq2;
         t10hsnumofyb1(1,j-50*Numoftime)=numofyb1;
         t10hsnumofyb2(1,j-50*Numoftime)=numofyb2;
         t10hsnumofzd1(1,j-50*Numoftime)=numofzd1;
         t10hsnumofzd2(1,j-50*Numoftime)=numofzd2;
         if j==75*Numoftime
               Averagedps10hs=mean(total10hs);
               Average10hsnohq1=mean(t10hsnumofhq1);
               Average10hsnohq2=mean(t10hsnumofhq2);
               Average10hsnoyb1=mean(t10hsnumofyb1);
               Average10hsnoyb2=mean(t10hsnumofyb2);
               Average10hsnozd1=mean(t10hsnumofzd1);
               Average10hsnozd2=mean(t10hsnumofzd2);
         end
      else
            total10cr(1,j-75*Numoftime)=dps;
            t10crnumofhq1(1,j-75*Numoftime)=numofhq1;
            t10crnumofhq2(1,j-75*Numoftime)=numofhq2;
            t10crnumofyb1(1,j-75*Numoftime)=numofyb1;
            t10crnumofyb2(1,j-75*Numoftime)=numofyb2;
            t10crnumofzd1(1,j-75*Numoftime)=numofzd1;
            t10crnumofzd2(1,j-75*Numoftime)=numofzd2;
            if j==100*Numoftime
                Averagedps10cr=mean(total10cr);
                Average10crnohq1=mean(t10crnumofhq1);
                Average10crnohq2=mean(t10crnumofhq2);
                Average10crnoyb1=mean(t10crnumofyb1);
                Average10crnoyb2=mean(t10crnumofyb2);
                Average10crnozd1=mean(t10crnumofzd1);
                Average10crnozd2=mean(t10crnumofzd2);
            end
      end
    end
end

end
value1=(Averagedps10hs-Averagedps)/(Averagedps10sp-Averagedps);
value2=(Averagedps10cr-Averagedps)/(Averagedps10sp-Averagedps);



图看起来都差不多,只要知道模拟结果是符合正态分布的就行了
基础面板下的25万次结果:

+10法伤面板下的25万次结果:

+10急速面板下的25万次结果:

+10暴击面板下的25万次结果:



四、伤害结构
我们可以看到,这套BIS的配装下,180秒总共大概是70个火球,28个炎爆,13个炸弹,技能数量分别占比63.1%,25.2%,11.7%)
如下图所示,第一行和第二行因为只改变了法伤,所以比例几乎是不变的
第二行增加了10急速,火球占比提高了一点点而炸弹占比降低了一点点,这主要是因为炸弹DOT不吃急速收益,所以一场战斗炸弹的次数其实基本是固定的,但急速增加了火球的数量,变相导致炸弹占比降低,炎爆无变化;
第三行增加了10暴击,火球占比明显下降(虽然我用的“明显”,但其实也就下降0.08%,只有拉到这个精确度才能看出来区别),炎爆占比明显提高,炸弹无变化。

ps.炸弹暴击率小于面板70%感觉还是有点问题,存疑,有空再来debug。

五、误差分析
1、一般收尾用灼烧+火冲更好,未考虑该条件;
2、根据2023年7月20日世界第一法师HTOC1号数据:亡统特效按总伤的2.5%计算,炎爆DOT按总伤的3.2%计算,分身伤害按18001计算;
3、点燃默认全部跳完;
4、未考虑部分抵抗(按照TBC的数据是会降低总伤5%左右);
5、无小括号的情况下先补炸弹再扔炎爆的手法应该更提高一点点炸弹的占比;
6、其他待补充……

六、参考意义
上面说了那么多,有啥意义呢?——嗯,几乎没有实际参考意义。
首先,TOC并没有3分钟的纯木桩环境,ICC应该也只有小萨较为接近这个条件;
其次,多目标,转阶段,各种条件的影响其实很大,比起这个这点暴击急速属性收益的换算带来的效果,在你一共就打十来次TOC的样本量之下,不如你去洗个脸,真的。

那么为什么要讲这么多废话并开这个帖子呢,算是自己挖的坑自己来填完吧,另外也想说明这个命题本身的困难性,要得到严谨的结论是非常困难的,而不是你张嘴就来我感觉~

同时,本文提供了模拟原代码,故可以带入你自己的属性来计算你当前装备下的收益
优势是所有内容我都可以和你解释清楚
劣势嘛,那就太多了,毕竟已经有很成熟的模拟网站了~

另外p3折磨火属性收益参考以及讨论,5.8数值收益算法优化有修正这篇帖子是从另一种方式做的推演,我和楼主也就这个问题一直在交流讨论,如有后续进展,我会更新。

方方圆圆272 发表于 2024-9-5 08:28:52

虽然我既不懂代码也不懂法师,但我还是想跟楼主讨论两个问题。
1.输出方式。
在大部分情况下无炸弹dot时应优先补充补炸弹后炎爆,我能想到的唯一一个需要先炎爆后补炸弹的场景是:
距离BOSS30码以内,且已经拥有一个小括号时,为避免浪费掉第二个法术连击,此时先炎爆后补炸弹。
除此之外的场景均应先补炸弹后施放炎爆。
2.计算方法。
相比于+1法伤/+1暴击/+1急速的方法,我想提供另一种我使用的方法(这种方法学习于橘子犀牛)。此时此刻我的秒伤为10000,如果我的秒伤想提高到10100,在只改变一项属性的情况下,我分别需要多少法伤、急速、暴击呢?
在暴击急速不变的情况下,计算提升1%DPS所需要的法伤值。
在法伤急速不变的情况下,计算提升1%DPS所需要的急速值。
在法伤暴击不变的情况下,计算提升1%DPS所需要的暴击值。
三值对比得出以法伤为基础暴击急速等价的法伤值。

疑骨德秋忘 发表于 2024-9-5 08:39:25

顶一下,貌似以我的认知也能计算,不过还是算了,等结果最好了

天寿保健护理彰 发表于 2024-9-5 08:43:30

朴素的认知里面,堆法伤稳定,堆急速有实际最高值,堆暴击求稳定,换算关系太难了,利用数学模型是对的,虽然打本不能考感觉,但是还是感觉法伤最好啊

清风JA1 发表于 2024-9-5 08:52:37

Wowhead上推荐黄槽就是法强极速,给的说法是2t9提供了精神属性提供了大量暴击,导致暴击收益低于极速,实际打下来看,火球暴击基本都在60+~70+,不是很稳定,脸黑白60出头,脸好可以接近80,达不到80的暴击率,个人感觉属性上装等优先,极速还是大于精神

C丶sunshine 发表于 2024-9-5 08:55:29

1.优化中,因为要增加判断参数,影响不大空了再说;
2.其实是一样的,就是一个精度的问题,严格意义的f&#39;(x)仅能通过函数解法,解析解也好,求极限逼近也好,但都很难,可以看我TBC的那篇理论解法,那个模型已经够简单了,求解精确解依然需要大量的计算和充足的线性代数知识储备。
所以用模拟的方法,是取同样的自变量还是同样的因变量,区别仅仅是取到这条曲线上的哪一个点而已,误差极小,虽然我说的+1,但我的模型里用的是+10,因为+1要求解的值的大小,和误差是一个量级了,要么提高精度增加模拟量(现在加起来已经是100万次了),要么就是扩大自变量,当然选后者啦,结果是差不多的。下面的图你看懂你就懂了。

白云追月素 发表于 2024-9-5 09:04:05

没事评论几句,让大家看看探讨一下

马宝清马宝清 发表于 2024-9-5 09:11:01

坐等大佬们的讨论…属性收益和另外一个大佬的可以说是完全不一样啊…

123457025 发表于 2024-9-5 09:16:03

你这个结果和之前其他人的计算差异比较大,有讨论过具体原因吗?我觉得大家如果要对比着看,得知道一些具体的原因才能判断到底采信哪一个

饺子姑娘 发表于 2024-9-5 09:24:36

没讨论出结果,但我的结论应该更接近wowsims的数值
毕竟两种方法都很麻烦,我要去看他的推导过程纠错,他没有整理要看懂非常花时间
我只能说我的方法全在代码里了,放这儿800多行有问题可以讨论因为我没看过sims的代码,所以如果我的结论和sims的结论趋近于一致的话,我倾向于我的数据更准确毕竟80的模型复杂了很多,理论求解必须做很多简单化假设,不然你根本没法算,而这个简单化你也不知道是不是简化了一些很重要的东西,而模拟可以解决这个问题
页: [1] 2
查看完整版本: [PVE] 基于模拟计算的法师P3阶段BIS配装下法伤/暴击/急速的收益权重(8.2更新sims对比)