//没登陆

欢迎您来到凯恩之角,奈非天!

帖子:1425

符文:2952

发表于 2012-11-24 07:13:27 |显示全部楼层 来自:英国
本帖最后由 牧者小天 于 2020-6-22 21:08 编辑

我在制作“冰法计算器”(http://bbs.d.163.com/thread-172411121-1-1.html)的过程中遇到一个问题,就是如何计算被动技能“冰冷之血”和主动技能“冰霜新星”的“刺骨之寒”符文的伤害加成效果。经过软件模拟,现已得出结论,特发本帖与冰法技术流分享。非技术流请略过本帖直接下载使用新版的“冰法计算器”。

感谢 迪卢木多指正,早前的错误已经被更正,问题其实没有那么复杂。

伤害加成机制

游戏中的技能描述如下:

  • “冰冷之血”:对冰冷与冻结的目标造成的所有伤害提高20%
  • “刺骨之寒”:被冰霜新星冻结或冰冷的敌人会受到15%额外的伤害

对于冰法而言,两者将在怪被冰霜新星冻结时提高怪受到的伤害:

  • 如果只用“冰冷之血”:伤害提高20%
  • 如果只用“刺骨之寒”:伤害提高15%
  • 如果两者都用:伤害提高(1+20%)*(1+15%)-100% = 38%

在怪没有被冻结时,两者的伤害加成均为0。

这就是说,除非能够基本实现“无限冰”(冰霜新星平均施放间隔 < 1.05秒),“冰冷之血”和“刺骨之寒”在一场战斗中的实际伤害加成系数没有20%、15%或38%那么高。计算这个实际伤害加成系数的关键,就是要先算出“怪被冻结的时间比例”(怪被冻结的时间 ÷ 战斗总时间),然后:
“冰冷之血”和“刺骨之寒”的实际伤害加成系数 = (20% 或 15% 或 38%) * 怪被冻结的时间比例

怪的控场抗性

我制作的冰法计算器能够计算出冰法的“冰霜新星平均施放间隔”。因为怪被冻结的最短时间是1.05秒,所以在一场战斗中,似乎:
怪被冻结的时间比例 = 1.05 ÷ 冰霜新星平均施放间隔

冰法计算器里也是这样计算的。但“怪被冻结的时间比例”会不会比使用上面这个表达式算出来的要高?因为如果冰霜新星平均施放间隔大于1.05秒(不能无限冰的情况),怪的控场抗性会降低,下一次被冰霜新星冻结的时间也许会大于1.05秒,因而怪被冻结的平均时间会大于1.05秒?

假设“冰霜新星施放间隔”固定且为2秒,那么具体情况是:

  • 怪物的控场抗性一开始是0%,被第1个冰霜新星击中后会被冰霜新星冻结3秒;
  • 怪被冻结2秒后,控场抗性上升到20%,此时第2个冰霜新星击中怪,怪可以被冻结(1 - 20%) * 3 = 2.4秒;
  • 怪被冻结2秒后,控场抗性上升到40%,此时第3个冰霜新星击中怪,怪可以被冻结(1 - 40%) * 3 = 1.8秒;
  • 怪被冻结1.8秒后,控场抗性上升到58%,解冻,此时距第4个冰霜新星击中怪还有0.2秒;
  • 怪自由活动0.2秒后,控场抗性下降到56%,此时第4个冰霜新星击中怪,怪可以被冻结(1 - 56%) * 3 = 1.32秒;
  • 怪被冻结1.32秒后,控场抗性上升到69.2%,解冻,此时距第5个冰霜新星击中怪还有0.68秒;
  • 怪自由活动0.68秒后,控场抗性下降到62.4%,此时第5个冰霜新星击中怪,怪可以被冻结(1 - 62.4%) * 3 = 1.128秒;
  • 怪被冻结1.128秒后,控场抗性上升到73.68%,解冻,此时距第6个冰霜新星击中怪还有0.872秒;
  • 怪自由活动0.872秒后,控场抗性下降到64.96%,此时第6个冰霜新星击中怪,怪可以被冻结(1 - 64.96%) * 3 = 1.0512秒;
  • 怪被冻结1.0512秒后,控场抗性上升到75.472%,解冻,此时距第7个冰霜新星击中怪还有0.9488秒;
  • 怪自由活动0.9488秒后,控场抗性下降到65.984%,此时第7个冰霜新星击中怪,虽然怪的控场抗性是69.6%,但因为炼狱模式下控场抗性的应用上限为65%,所以怪可以被冻结(1 - 65%) * 3 = 1.05秒;
  • 怪被冻结1.05秒后,控场抗性上升到76.484%,解冻,此时距第8个冰霜新星击中怪还有0.95秒;
  • 怪自由活动0.95秒后,控场抗性下降到66.984%,此时第8个冰霜新星击中怪,怪可以被冻结(1 - 65%) * 3 = 1.05秒;
  • 怪被冻结1.05秒后控场抗性上升到77.484%,解冻,此时距第9个冰霜新星击中怪还有0.95秒;
  • 怪自由活动0.95秒后,控场抗性下降到67.984%,此时第9个冰霜新星击中怪,怪可以被冻结(1 - 65%) * 3 = 1.05秒;
  • 怪被冻结1.05秒后控场抗性上升到78.484%,解冻……

可以看出,在“冰霜新星施放间隔”固定为2秒的假设下,从第7个冰霜新星击中怪开始怪每次总是能被冻结1.05秒,而且内部控场抗性稳步上升。这个内部控场抗性能否超过100%未知(我认为不会),但这不会改变什么。在MP10的boss战中施放冰霜新星的次数可以达到数百,忽略开头那几次怪被冻结超过1.05秒的情况,本节最开始给出的“怪被冻结的时间比例”的表达式是适用于这种情况的。


模拟程序

上面的举例分析假设的是“冰霜新星施放间隔”固定为2秒的情况。如果“冰霜新星施放间隔”固定为更长或更短的时间呢?我决定用“暴力”的方法分析一下,于是写了下面的MATLAB程序。程序对“冰霜新星施放间隔”(假设在一场战斗中固定)从0秒(绝对的无限冰)模拟到15秒(无聊了就冰一下),0.0001秒一跳。每一跳,程序模拟10万次冰霜新星顺序施放,计算怪被冰霜新星冻结的时间之和,然后算出“怪被冻结的时间比例”。
  1. num_frost_nova_casts = 1e5;
  2. fixed_frost_nova_cast_interval_all = 0:0.0001:15;

  3. monster_cc_resist_cap = 0.65;
  4. frost_nova_freeze_duration_default = 3;

  5. results = zeros(length(fixed_frost_nova_cast_interval_all), 2);

  6. for i = 1:length(fixed_frost_nova_cast_interval_all)
  7.     fixed_frost_nova_cast_interval = fixed_frost_nova_cast_interval_all(i);
  8.     total_monster_frozen_duration = 0;
  9.     total_monster_free_duration = 0;
  10.     monster_cc_resist = 0;
  11.     for frost_nova_cast = 1:num_frost_nova_casts
  12.         if (monster_cc_resist > monster_cc_resist_cap)
  13.             monster_frozen_duration = frost_nova_freeze_duration_default * (1 - monster_cc_resist_cap);
  14.         else
  15.             monster_frozen_duration = frost_nova_freeze_duration_default * (1 - monster_cc_resist);
  16.         end
  17.         if (monster_frozen_duration > fixed_frost_nova_cast_interval)
  18.             monster_frozen_duration = fixed_frost_nova_cast_interval;
  19.         end
  20.         monster_cc_resist = monster_cc_resist + monster_frozen_duration * 0.1;
  21.         if (monster_cc_resist > 1)
  22.             monster_cc_resist = 1;
  23.         end
  24.         monster_free_duration = fixed_frost_nova_cast_interval - monster_frozen_duration;
  25.         monster_cc_resist = monster_cc_resist - monster_free_duration * 0.1;
  26.         if (monster_cc_resist < 0)
  27.             monster_cc_resist = 0;
  28.         end        
  29.         total_monster_frozen_duration = total_monster_frozen_duration + monster_frozen_duration;
  30.         total_monster_free_duration = total_monster_free_duration + monster_free_duration;
  31.     end
  32.     proportion_of_time_monster_frozen = total_monster_frozen_duration / (total_monster_frozen_duration + total_monster_free_duration);
  33.     results(i,:) = [fixed_frost_nova_cast_interval proportion_of_time_monster_frozen];
  34. end
复制代码
通过模拟得出的“冰霜新星施放间隔”与“怪被冻结的时间比例”之间的关系如下图所示:

怪被冻结的时间比例

怪被冻结的时间比例


可以看出曲线分为四个区域:

  • “冰霜新星施放间隔”从0秒到1.05秒,“怪被冻结的时间比例”为100%(无限冰);
  • “冰霜新星施放间隔”从1.05秒到2.1秒,“怪被冻结的时间比例”从100%下降到50%;
  • “冰霜新星施放间隔”从2.1秒到6秒,“怪被冻结的时间比例”全部在50%左右(这是之前没有料到的);
  • “冰霜新星施放间隔”从6秒到15秒,“怪被冻结的时间比例”从50%下降到20%。

值得注意的是第三个区域,它表明如果“冰霜新星施放间隔”在2.1秒到6秒之间,“怪被冻结的时间比例”都是50%。

为了能够从“冰霜新星平均施放间隔”直接计算出“怪被冻结的时间比例”,我们可以直接写出各个区域的表达式:
  • 怪被冻结的时间比例 = 1,适用于0秒 <= 冰霜新星施放间隔 < 1.05秒;
  • 怪被冻结的时间比例 = 1.05秒 ÷ 冰霜新星施放间隔,适用于1.05秒 <= 冰霜新星施放间隔 < 2.1秒;
  • 怪被冻结的时间比例 = 0.5,适用于2.1秒 <= 冰霜新星施放间隔 < 6秒;
  • 怪被冻结的时间比例 = 3秒 ÷ 冰霜新星施放间隔,适用于6秒 <= 冰霜新星施放间隔。

问题其实没有这么简单(幸运的是:结论不变)

在上面提到的模拟程序中,我假设了“冰霜新星施放间隔”是一个固定值。在实战中,因为暴击和临界质量都按一定几率随机触发,所以“冰霜新星施放间隔”并不是固定的。但我想,如果把上面得到的表达式中的“冰霜新星施放间隔”改为“冰霜新星平均施放间隔”,表达式将依然适用。为了验证这一猜想,我将上面的MATLAB模拟程序略加改动,引入“冰霜新星施放间隔”的随机性(偷个懒,假设“冰霜新星施放间隔”在“冰霜新星平均施放间隔”±0.5秒间连续均匀分布)。程序模拟1亿次冰霜新星顺序施放,检查结果是否与之前的一致。以“冰法计算器”那帖(http://bbs.d.163.com/thread-172411121-1-1.html)的“举例说明”中的计算结果:

冰霜新星平均施放间隔 = 1.648885839秒

为例,MATLAB程序代码是:
  1. num_frost_nova_casts = 1e8;
  2. avg_frost_nova_cast_interval = 1.648885839;

  3. monster_cc_resist_cap = 0.65;
  4. frost_nova_freeze_duration_default = 3;

  5. a = avg_frost_nova_cast_interval - 0.5;
  6. b = avg_frost_nova_cast_interval + 0.5;
  7. frost_nova_cast_interval_all = a + (b - a) .* rand(num_frost_nova_casts, 1);

  8. total_monster_frozen_duration = 0;
  9. total_monster_free_duration = 0;
  10. monster_cc_resist = 0;
  11. for frost_nova_cast = 1:num_frost_nova_casts
  12.     frost_nova_cast_interval = frost_nova_cast_interval_all(frost_nova_cast);
  13.     if (monster_cc_resist > monster_cc_resist_cap)
  14.         monster_frozen_duration = frost_nova_freeze_duration_default * (1 - monster_cc_resist_cap);
  15.     else
  16.         monster_frozen_duration = frost_nova_freeze_duration_default * (1 - monster_cc_resist);
  17.     end
  18.     if (monster_frozen_duration > frost_nova_cast_interval)
  19.         monster_frozen_duration = frost_nova_cast_interval;
  20.     end
  21.     monster_cc_resist = monster_cc_resist + monster_frozen_duration * 0.1;
  22.     if (monster_cc_resist > 1)
  23.         monster_cc_resist = 1;
  24.     end
  25.     monster_free_duration = frost_nova_cast_interval - monster_frozen_duration;
  26.     monster_cc_resist = monster_cc_resist - monster_free_duration * 0.1;
  27.     if (monster_cc_resist < 0)
  28.         monster_cc_resist = 0;
  29.     end
  30.     total_monster_frozen_duration = total_monster_frozen_duration + monster_frozen_duration;
  31.     total_monster_free_duration = total_monster_free_duration + monster_free_duration;
  32. end
  33. proportion_of_time_monster_frozen = total_monster_frozen_duration / (total_monster_frozen_duration + total_monster_free_duration);
  34. results = [avg_frost_nova_cast_interval proportion_of_time_monster_frozen];
复制代码
程序运行的结果是:

怪被冻结的时间比例 = 0.636785651141958

如果用上面给出的表达式直接计算,结果是0.636793630683852。两个结果确实是非常地接近。

最后的结论是:
  • 怪被冻结的时间比例 ~= 1,适用于0秒 <= 冰霜新星平均施放间隔 < 1.05秒(基本无限冰的情况);
  • 怪被冻结的时间比例 = 1.05秒 ÷ 冰霜新星平均施放间隔,适用于1.05秒 <= 冰霜新星平均施放间隔 < 2.1秒;
  • 怪被冻结的时间比例 = 0.5,适用于2.1秒 <= 冰霜新星平均施放间隔 < 6秒;
  • 怪被冻结的时间比例 = 3秒 ÷ 冰霜新星平均施放间隔,适用于6秒 <= 冰霜新星平均施放间隔。

实际伤害加成系数

现在,我们可以从任意给定的“冰霜新星平均施放间隔”计算出“怪被冻结的时间比例”,然后使用本帖最开始给出的表达式,就可以算出“冰冷之血”和“刺骨之寒”的实际伤害加成系数。

再次以

冰霜新星平均施放间隔 = 1.648885839秒

为例,先用上面给出的表达式算出:

怪被冻结的时间比例 = 1.05 / 1.648885839 = 0.636793630683852

如果同时使用“冰冷之血”和“刺骨之寒”,怪被冻结时受到的伤害提高38%,所以:

“冰冷之血”和“刺骨之寒”的实际伤害加成系数 = 38% * 0.636793630683852 = 24.20%


应用

这一研究结果已被应用于最新版的“冰法计算器”(http://bbs.d.163.com/thread-172411121-1-1.html),使得DPS放大倍数的计算更加准确。欢迎大家下载使用并提出意见!

点评

cnrpg@163.com  你妹的 仙塞大神啊  发表于 2013-1-29 16:04
unarhur@126.com  罩子呢?什么时候能把罩子加上去?  发表于 2013-1-29 12:14
kashamoo  神原本也是人,只是他做了一些人做不到的事。。。。  发表于 2013-1-16 18:19
Decablo  技术宅拯救世界  发表于 2012-12-12 13:22
fzzz  耶稣您好  发表于 2012-11-26 14:52
SORAL  最高只能加100。。。。。我已经尽力了。。  发表于 2012-11-25 05:29
已有 4 人评分 符文 收起 理由
serenabeauty + 10 虽然看不懂,但是还是觉得很厉害的样子~~~~
飞翔的胖达 + 100 一直觉得仙塞的数据帝是站在凯恩之巅的…
雁门寨主 + 50 + 5 圣光笼罩着你
SORAL + 100 + 5 这个太强大了

总评分:  + 260  符文 + 10   查看全部评分

下载:冰法计算器NY改进版
更新档 2.0.1:临界质量已经从游戏中移除。

帖子:89

符文:0

2#
厉害!!!!我最佩服技术贴了!
发表于 2012-11-24 07:17:01 来自凯恩之角App |显示全部楼层 来自:广东

帖子:859

符文:2

3#
如果單個精英怪(非boss)都能做到無限冰的話,是不是說使用"冰冷之血"和"刺骨之寒"后,傷害加成就能達到35%+了呢?
发表于 2012-11-24 07:26:11 |显示全部楼层 来自:广东
[armory]http://cn.battle.net/d3/en/profile/JohnHu-5333/hero/20682337[/armory]

帖子:1425

符文:2952

4#
joekoo 发表于 2012-11-24 07:26
如果單個精英怪(非boss)都能做到無限冰的話,是不是說使用"冰冷之血"和"刺骨之寒"后,傷害加成就能達到35%+了 ...

嗯,如果做到了无限冰,那么“怪被冻结的时间比例”等于1,“冰冷之血”和“刺骨之寒”的实际伤害加成系数 = 38% * 1 = 38%,即全程享受伤害加成。

发表于 2012-11-24 07:30:16 |显示全部楼层 来自:英国
下载:冰法计算器NY改进版
更新档 2.0.1:临界质量已经从游戏中移除。

帖子:859

符文:2

5#
那我現在上戰網兩個都用試試...
发表于 2012-11-24 07:32:55 |显示全部楼层 来自:广东
[armory]http://cn.battle.net/d3/en/profile/JohnHu-5333/hero/20682337[/armory]

帖子:1425

符文:2952

6#
joekoo 发表于 2012-11-24 07:32
那我現在上戰網兩個都用試試...

好!期待测试结果。
发表于 2012-11-24 07:35:37 |显示全部楼层 来自:英国
下载:冰法计算器NY改进版
更新档 2.0.1:临界质量已经从游戏中移除。

帖子:859

符文:2

7#
我測試的是MP6,感覺效果還是不錯的,傷害無論是白字還是黃字都顯著增加了!
但是無限冰的效果沒有之前好了,單個精英比我原來的build動作稍微多了點.
发表于 2012-11-24 09:24:07 |显示全部楼层 来自:广东
[armory]http://cn.battle.net/d3/en/profile/JohnHu-5333/hero/20682337[/armory]

帖子:859

符文:2

8#
本帖最后由 joekoo 于 2012-11-24 10:49 编辑

補一幅開電甲,無buff,不帶林登的屬性圖,屬性一般,大家勿噴:

Image00019.jpg

发表于 2012-11-24 09:52:53 |显示全部楼层 来自:广东
[armory]http://cn.battle.net/d3/en/profile/JohnHu-5333/hero/20682337[/armory]

帖子:1425

符文:2952

9#
joekoo 发表于 2012-11-24 09:24
我測試的是MP6,感覺效果還是不錯的,傷害無論是白字還是黃字都顯著增加了!
但是無限冰的效果沒有之前好了,單 ...

谢谢反馈!

你前后技能组合之间的区别是不是只是没用“冰冷之血”和“刺骨之寒”、用了“冰冷之血”和“刺骨之寒”?按理来说,这两个技能是只会提高伤害,不会影响减CD、击回、暴回这些的噢。

发表于 2012-11-24 10:03:59 |显示全部楼层 来自:英国
下载:冰法计算器NY改进版
更新档 2.0.1:临界质量已经从游戏中移除。

帖子:859

符文:2

10#
2626 发表于 2012-11-24 10:03
谢谢反馈!

你前后技能组合之间的区别是不是只是没用“冰冷之血”和“刺骨之寒”、用了“冰冷之血”和 ...

因為之前用的是"急速冰凍"和"煥法",能基本做到單個精英無限冰.
发表于 2012-11-24 10:08:17 |显示全部楼层 来自:广东
[armory]http://cn.battle.net/d3/en/profile/JohnHu-5333/hero/20682337[/armory]

帖子:4751

符文:48

11#
本帖最后由 寂静 于 2012-11-24 10:18 编辑
joekoo 发表于 2012-11-24 10:08
因為之前用的是"急速冰凍"和"煥法",能基本做到單個精英無限冰.

想要伤害,就果断放弃无缝冰,因为冰环占出手时间
我平时farm都是用极度冰冻符文的,只有打boss采用极速冰冻控场
唤法是攻防兼备技能(减少碎钻、聚能CD),无论何时何地都戴上它
发表于 2012-11-24 10:12:52 |显示全部楼层 来自:广东
[armory]http://us.battle.net/d3/en/profile/silenceyun-1370/hero/16972029[/armory]

帖子:1425

符文:2952

12#
joekoo 发表于 2012-11-24 10:08
因為之前用的是"急速冰凍"和"煥法",能基本做到單個精英無限冰.

懂了!你现在不用“急速冰冻”(也许还没有用“唤法”),冰霜新星平均施放间隔增加,就没有之前容易冰住了。详细可用首帖中提到的计算器算一算。
发表于 2012-11-24 10:16:18 |显示全部楼层 来自:英国
下载:冰法计算器NY改进版
更新档 2.0.1:临界质量已经从游戏中移除。

帖子:1425

符文:2952

13#
寂静 发表于 2012-11-24 10:12
唤法是攻防兼备技能(减少碎钻、聚能CD),无论何时何地都戴上它

所言极是!   

发表于 2012-11-24 10:18:52 |显示全部楼层 来自:英国
下载:冰法计算器NY改进版
更新档 2.0.1:临界质量已经从游戏中移除。

帖子:859

符文:2

14#
嗯,以我的冰法面版要無限冰的話,急速冰凍是必須的.
我很少用極度冰寒,因為覺得爆擊幾率足夠高的情況下,極度冰寒可以不用了,況且面對不是結群精英或者boss的時候,極度冰寒沒有急速冰凍好用,尤其是戰雙boss的時候,因為比較懶,不想經常換技能,所以直接急速冰凍,懶得換了.
发表于 2012-11-24 10:24:31 |显示全部楼层 来自:广东
[armory]http://cn.battle.net/d3/en/profile/JohnHu-5333/hero/20682337[/armory]

帖子:3437

符文:71

15#
本帖最后由 迪卢木多 于 2012-11-24 11:08 编辑

有个地方有问题,怪物的抵抗上限是65没错。但是它不会限制到65后不再上涨,也就是说数字一直在增加,效果只有65而已,所以并不会出现后期控制时间大于1. 05的情况
这么说来算法还需要微调下。。。。。我相信你可以的~~~来自: iPhone客户端
发表于 2012-11-24 10:36:42 来自凯恩之角App |显示全部楼层 来自:浙江
您需要登录后才可以回帖 登录 | 注册网易通行证