先说一下一些前提条件,不一定是正确的,但没有这些条件的话,成本计算就无从谈起了:
1、1~4级技能的升级概率分别是50%,35%,20%,10%
2、每吃一只材料,最多同时升级2个技能,即使材料拥有3个主技能
3、吃全五天狼的最佳方案是,如果有3个或以上的技能没有满5级,那优先选择拥有3个主技能的材料
4、按桃园的物价来算,带天狼爪的3技能、2技能、1技能材料价格分别是11.5E、9.5E、8.5E,不带天狼爪的3技能、2技能、1技能材料价格分别是9.5E、7.5E、6E。完美满级四技能坯子天狼的价格为17.5E,币价为254。
好,有了以上前提条件,很容易计算5554天狼(5级狼爪)升到5555天狼的数学期望成本,就是需要花费10只单主技能材料狼,按照桃园目前非天狼爪的单主技能材料天狼的价格(6E)来算,需要花费60E * 250 = 1.5W。
问题是,楼主思考了很久,前面的技能升级,好像没法用传统的数学方法去解决,因为限制条件太多,比如每次最多升级2个技能这样的限制条件。
那怎么计算全五天狼的数学期望成本呢?答案是可以写代码来模拟
楼主比较熟悉python,就用python来写。先写一个天狼模拟器,定义一个SkyWolf(天狼)类型,它里面有upgrade_skill方法,返回要吃的下一只材料的主技能个数和价格。upgrade_skill方法也是我们的核心代码了:

本文开头所述的前提条件,在这段代码里面基本都有体现,也写了比较详细的代码注释,有点代码基础的同学应该不难看懂。
好了,有了这段核心代码,我们来模拟一只天狼从1111到5555的全过程:

运行代码,控制台输出:

看起来没啥问题!接下来就是,运行10万次模拟全五天狼的升级过程,算出成本价,计算平均值(数学期望)了:

运行程序,控制台输出:

全五天狼的数学期望成本,约为8.9万!
我们稍微改一下程序,就可以得到5554天狼的期望成本(不区分是4级天狼爪还是其他),约为7.3万:

以上输出的消耗3技能、2技能、1技能材料的只数,可以适用到其他天品灵兽上,至于期望成本,就要看各区的材料价格、坯子价格、币价了。
楼主把代码贴在这里,感兴趣的可以自取。
import random
class SkyWolf(object):
def __init__(self):
self.skills = [1, 1, 1, 1] # 初始技能等级
def upgrade_skill(self):
"""
吃一只材料天狼,升级技能
:return: 吃掉的材料天狼的主技能数量、价格
"""
material_skill_count = 0 # 材料天狼的主技能数量
material_skill_index = [] # 材料天狼的主技能,对应的初始技能的下标
for index, skill_level in enumerate(self.skills):
if skill_level < 5:
if material_skill_count < 3: # 材料天狼最多3个主技能
material_skill_count += 1
material_skill_index.append(index)
material_skill_index = random.sample(material_skill_index, material_skill_count) # 材料天狼随机挑选技能
success_count = 0 # 成功升级的技能数量
for index in material_skill_index:
skill_level = self.skills[index] # 下标对应的技能等级
success_rate = {1: 0.5, 2: 0.35, 3: 0.2, 4: 0.1}[skill_level] # 技能等级 -> 升级概率
if random.random() < success_rate: # 模拟升级概率
self.skills[index] += 1
success_count += 1
if success_count >= 2: # 每次最多成功升级两个技能
break
if 0 in material_skill_index: # 带爪
if material_skill_count == 3: # 带爪3技能
return material_skill_count, 11.5
elif material_skill_count == 2: # 带爪2技能
return material_skill_count, 9
elif material_skill_count == 1: # 带爪1技能
return material_skill_count, 8
else: # 不带爪
if material_skill_count == 3: # 不带爪3技能
return material_skill_count, 9.5
elif material_skill_count == 2: # 不带爪2技能
return material_skill_count, 7
elif material_skill_count == 1: # 不带爪1技能
return material_skill_count, 6
@property
def complete(self):
for skill_level in self.skills:
if skill_level < 5:
return False
return True
def main():
total = 100000
materials = []
total_price = 0
for _ in range(total):
sky_wolf = SkyWolf()
# print('初始化天狼,技能等级:{}'.format(sky_wolf.skills))
while not sky_wolf.complete:
material_skill_count, price = sky_wolf.upgrade_skill()
# print('吃了{}技能材料狼,技能等级:{}'.format(material_skill_count, sky_wolf.skills))
materials.append(material_skill_count)
total_price += price
_li = total, materials.count(3) / total, materials.count(2) / total, materials.count(1) / total, total_price / total
print('升级{}只全五天狼,平均消耗3技能天狼{}只,2技能天狼{}只,1技能天狼{}只,花费{}E'.format(*_li))
expected_cost = ((total_price / total) + 17.5) * 250
print('全五天狼期望成本:{}'.format(expected_cost))
# sky_wolf = SkyWolf()
#
# print('初始化天狼,技能等级:{}'.format(sky_wolf.skills))
#
# while not sky_wolf.complete:
# material_skill_count = sky_wolf.upgrade_skill()
# print('吃了{}技能材料狼,技能等级:{}'.format(material_skill_count, sky_wolf.skills))
if __name__ == '__main__':
main()
1、1~4级技能的升级概率分别是50%,35%,20%,10%
2、每吃一只材料,最多同时升级2个技能,即使材料拥有3个主技能
3、吃全五天狼的最佳方案是,如果有3个或以上的技能没有满5级,那优先选择拥有3个主技能的材料
4、按桃园的物价来算,带天狼爪的3技能、2技能、1技能材料价格分别是11.5E、9.5E、8.5E,不带天狼爪的3技能、2技能、1技能材料价格分别是9.5E、7.5E、6E。完美满级四技能坯子天狼的价格为17.5E,币价为254。
好,有了以上前提条件,很容易计算5554天狼(5级狼爪)升到5555天狼的数学期望成本,就是需要花费10只单主技能材料狼,按照桃园目前非天狼爪的单主技能材料天狼的价格(6E)来算,需要花费60E * 250 = 1.5W。
问题是,楼主思考了很久,前面的技能升级,好像没法用传统的数学方法去解决,因为限制条件太多,比如每次最多升级2个技能这样的限制条件。
那怎么计算全五天狼的数学期望成本呢?答案是可以写代码来模拟
楼主比较熟悉python,就用python来写。先写一个天狼模拟器,定义一个SkyWolf(天狼)类型,它里面有upgrade_skill方法,返回要吃的下一只材料的主技能个数和价格。upgrade_skill方法也是我们的核心代码了:

本文开头所述的前提条件,在这段代码里面基本都有体现,也写了比较详细的代码注释,有点代码基础的同学应该不难看懂。
好了,有了这段核心代码,我们来模拟一只天狼从1111到5555的全过程:

运行代码,控制台输出:

看起来没啥问题!接下来就是,运行10万次模拟全五天狼的升级过程,算出成本价,计算平均值(数学期望)了:

运行程序,控制台输出:
全五天狼的数学期望成本,约为8.9万!
我们稍微改一下程序,就可以得到5554天狼的期望成本(不区分是4级天狼爪还是其他),约为7.3万:
以上输出的消耗3技能、2技能、1技能材料的只数,可以适用到其他天品灵兽上,至于期望成本,就要看各区的材料价格、坯子价格、币价了。
楼主把代码贴在这里,感兴趣的可以自取。
import random
class SkyWolf(object):
def __init__(self):
self.skills = [1, 1, 1, 1] # 初始技能等级
def upgrade_skill(self):
"""
吃一只材料天狼,升级技能
:return: 吃掉的材料天狼的主技能数量、价格
"""
material_skill_count = 0 # 材料天狼的主技能数量
material_skill_index = [] # 材料天狼的主技能,对应的初始技能的下标
for index, skill_level in enumerate(self.skills):
if skill_level < 5:
if material_skill_count < 3: # 材料天狼最多3个主技能
material_skill_count += 1
material_skill_index.append(index)
material_skill_index = random.sample(material_skill_index, material_skill_count) # 材料天狼随机挑选技能
success_count = 0 # 成功升级的技能数量
for index in material_skill_index:
skill_level = self.skills[index] # 下标对应的技能等级
success_rate = {1: 0.5, 2: 0.35, 3: 0.2, 4: 0.1}[skill_level] # 技能等级 -> 升级概率
if random.random() < success_rate: # 模拟升级概率
self.skills[index] += 1
success_count += 1
if success_count >= 2: # 每次最多成功升级两个技能
break
if 0 in material_skill_index: # 带爪
if material_skill_count == 3: # 带爪3技能
return material_skill_count, 11.5
elif material_skill_count == 2: # 带爪2技能
return material_skill_count, 9
elif material_skill_count == 1: # 带爪1技能
return material_skill_count, 8
else: # 不带爪
if material_skill_count == 3: # 不带爪3技能
return material_skill_count, 9.5
elif material_skill_count == 2: # 不带爪2技能
return material_skill_count, 7
elif material_skill_count == 1: # 不带爪1技能
return material_skill_count, 6
@property
def complete(self):
for skill_level in self.skills:
if skill_level < 5:
return False
return True
def main():
total = 100000
materials = []
total_price = 0
for _ in range(total):
sky_wolf = SkyWolf()
# print('初始化天狼,技能等级:{}'.format(sky_wolf.skills))
while not sky_wolf.complete:
material_skill_count, price = sky_wolf.upgrade_skill()
# print('吃了{}技能材料狼,技能等级:{}'.format(material_skill_count, sky_wolf.skills))
materials.append(material_skill_count)
total_price += price
_li = total, materials.count(3) / total, materials.count(2) / total, materials.count(1) / total, total_price / total
print('升级{}只全五天狼,平均消耗3技能天狼{}只,2技能天狼{}只,1技能天狼{}只,花费{}E'.format(*_li))
expected_cost = ((total_price / total) + 17.5) * 250
print('全五天狼期望成本:{}'.format(expected_cost))
# sky_wolf = SkyWolf()
#
# print('初始化天狼,技能等级:{}'.format(sky_wolf.skills))
#
# while not sky_wolf.complete:
# material_skill_count = sky_wolf.upgrade_skill()
# print('吃了{}技能材料狼,技能等级:{}'.format(material_skill_count, sky_wolf.skills))
if __name__ == '__main__':
main()



水怪猎手












