下载 App

【幻塔】[数据研究] 初窥幻塔抽卡机制

2022/09/261490 浏览综合
原帖是大佬发布在NGA的攻略贴,个人在使用过程中受益颇多,申请搬运到taptap供大家使用。不做任何商业用途,如有侵权,我会立即删除本帖。
[数据研究] 初窥幻塔抽卡机制
===引子===
最近想着看一看各个抽卡游戏的抽卡系统设计,多收集收集,并改进一下自己的工具包,看了好几个游戏的抽卡机制。
这次就来看看幻塔的抽卡机制。
===武器官方公示概率===
金核和赤核抽取SSR武器基础概率0.75%,综合概率2%(即加入80抽保底)
金核和赤核抽取SR武器基础概率1%,综合概率12%(即加入10抽保底)
SSR好说,按照每次80循环中的1-79抽时概率固定为0.75%,第80抽固定100%计算,对应综合概率为1.990625%,和公示的2%非常接近。如果把1-79抽的概率改为0.76%,则综合概率为2.0005%,说不定真实情况固定的概率是0.76%不是0.75%,只是文案想凑5的倍数。
SR就有点看不懂了,稍微看了一些主播抽卡,人工统计了一小批数据。
8 7 7 7 7 8 8 10 10 10 9 9 8 9 9 8 9 10 9 8 9 9 9 9 8 9 9 10 8 9 9 1 1 8 8 9 4 3 8 3 10 8 9 9 9 8 9 8 9 9 8 9 9 8 8 9 10 9 8 8 9 9 9 8 8 9 9 10 9 10 8 8 1 9 9 8 9 9 9 9 10 6 2 9 9 8 8 8 8 8 9 8 8 8 3 5 10 8 9 8 10 9 10 8 9 2 6 8 10 9 8 8 9 9 8 10 10 9 8 8 10 8 9 10 8 9 8 10 9 10 1 8 10 10 10 10 5 3 8 9 10 8 9 10 10 9 8 9 9 9 10 10 7 1 10 10
TapTap
可以看出SR是有概率递增的,概率从第8抽开始递增。不过由于数据有限,并且大家不是很在乎SR的样子,就随便凑了凑,从第8抽开始每抽递增0.33,把综合概率凑到了11.7%,如图中橙线所示。
===采用模型===
SSR采用模型同官方公示,1-79固定0.75%,第80抽固定100%
SR采用模型稍有改动,1-7固定1%,第8抽34%,第9抽67%。
由于幻塔的抽卡机制不满足无后效性(出了SSR就重置保底),还有铸金兑换的机制,之前基于抽卡道具获取后就重置保底假设的工具就不好用了,需要专门为这个问题写一点DP才能解决问题。
但在群友的帮助下,了解到贴吧有人已经写了DP了(楼主id:immortalcow),代码仓库。
看了下应该没写错,该考虑的情况都考虑到了,那我就懒得写了,稍微改写加入SR概率递增就直接拿来画图。
TapTap
不过没写意志的抽取,我也懒得搞了,以后有空了再在这个基础上改改。
嘛,没有足够的抽卡记录,也只能做到这种程度了。
===其他小点===
限制意义:假设SSR已经有7个后,再抽同样的SSR返还铸金仍为2个。设SSR综合概率2%,SR综合概率12%,同时SR已经全满(此时期望定义为,当抽数趋于无穷时平均每个道具所花费的抽数。
以下在限制意义下进行讨论(实际情况下每次UP抽数是有限的,总是会比限制意义下更差)
对于SSR获取的来源来说42.51%来自80抽保底,32.3%来自120铸金兑换,25.19%来自非保底区域
对于限定SSR获取的来源来说32.13%来自80抽保底,48.84%来自120铸金兑换,19.03%来自非保底区域
TapTap
限制意义下,每个SSR的期望为34抽,每个限定SSR的期望为51.406抽。这个值比实际情况所需的值低了很多,一般情况可以参考下表。(不过好像有点点小问题,晚点检查一下)
TapTap
当然在这个限制意义下并不适合指导普通玩家抽卡,还是看上面的图吧。总之,不抽到120保底会很亏。
===代码===
code
[code=py]
# edit by OneBST
import numpy
import pandas
pandas.set_option("display.max_rows",1000)
import matplotlib
from matplotlib import pyplot as plt
# matplotlib.rcParams["font.sans-serif"]=["SimHei"]
# matplotlib.rcParams["axes.unicode_minus"]=False
#幻塔官方公布的抽卡概率数值
SSR_PROBABILITY_BASIC=0.0075
SR_PROBABILITY_BASIC=0.01
SSR_PROBABILITY_CRITICAL=0.5
SSR_INSURANCE_LIMIT=80
SR_INSURANCE_LIMIT=10
SSR_PRICE_GOLD_CAST=120
SSR_MAX_COUNT=7
#开始抽卡前的状态配置,请注意根据自身情况修改
MAX_STEPS=764 #最多抽这么多次
SSR_INSURANCE=0 #当前SSR小保底计数
SR_INSURANCE=0 #当前SR保底计数
GOLD_CAST=0 #当前已有回火铸金数
def AddOrUpdate(state,key,value):
if key in state:
state[key]+=value
else:
state[key]=value
#处理铸金到SSR取得数的转换,以及设置SSR取得数封顶以避免状态空间无限扩展
def ProcessState(ssr_count,ssr_insurance,sr_insurance,gold_cast):
if gold_cast>=SSR_PRICE_GOLD_CAST:
ssr_count+=gold_cast//SSR_PRICE_GOLD_CAST
gold_cast%=SSR_PRICE_GOLD_CAST
if ssr_count>=SSR_MAX_COUNT:#都已经抽满了还算个毛线
return (SSR_MAX_COUNT,0,0,0)
return ssr_count,ssr_insurance,sr_insurance,gold_cast
#当前状态概率分布为state,计算下一抽后的概率分布
def Transfer(state):
result={}
for (ssr_count,ssr_insurance,sr_insurance,gold_cast),probability in state.items():
if ssr_count>=SSR_MAX_COUNT:
AddOrUpdate(result,(SSR_MAX_COUNT,0,0,0),probability)
continue
ssr_insurance+=1
sr_insurance+=1
#SSR小保底,只有两种可能
if ssr_insurance>=SSR_INSURANCE_LIMIT:
AddOrUpdate(result,ProcessState(ssr_count+1,0,0,gold_cast+1),probability*SSR_PROBABILITY_CRITICAL)
AddOrUpdate(result,ProcessState(ssr_count,0,0,gold_cast+1),probability*(1-SSR_PROBABILITY_CRITICAL))
continue
#非保底出SSR的结算比SR保底优先
AddOrUpdate(result,ProcessState(ssr_count+1,ssr_insurance,0,gold_cast+1),probability*SSR_PROBABILITY_BASIC*SSR_PROBABILITY_CRITICAL)
AddOrUpdate(result,ProcessState(ssr_count,ssr_insurance,0,gold_cast+1),probability*SSR_PROBABILITY_BASIC*(1-SSR_PROBABILITY_CRITICAL))
#SR保底且未命中SSR
if sr_insurance>=SR_INSURANCE_LIMIT:
AddOrUpdate(result,ProcessState(ssr_count,ssr_insurance,0,gold_cast+2),probability*(1-SSR_PROBABILITY_BASIC))
continue
#非保底且未命中SSR
sr_rate_now = SR_PROBABILITY_BASIC
# OneBSR修正 SR加入简单的概率递增修正
if sr_insurance == 9:
sr_rate_now = 0.66+0.01
if sr_insurance == 8:
sr_rate_now = 0.33+0.01
AddOrUpdate(result,ProcessState(ssr_count,ssr_insurance,0,gold_cast+2),probability*(1-SSR_PROBABILITY_BASIC)*sr_rate_now)
AddOrUpdate(result,ProcessState(ssr_count,ssr_insurance,sr_insurance,gold_cast+1),probability*(1-SSR_PROBABILITY_BASIC)*(1-sr_rate_now))
return result
#简化概率分布,只关心SSR取得数
def GetDistribute(state):
result=[0]*(SSR_MAX_COUNT)
for (ssr_count,_,__,___),probability in state.items():
for i in range(ssr_count):
result+=probability
return result
#执行概率计算
def CalculateSteps(max_step,ssr_insurance=0,sr_insurance=0,gold_cast=0):
results=[{(0,ssr_insurance,sr_insurance,gold_cast):1}]
for _ in range(max_step):
results.append(Transfer(results[-1]))
results[-2]=GetDistribute(results[-2])
for i,j in results[-1].items():
if i[0]==0:
print(i,j)
results[-1]=GetDistribute(results[-1])
return pandas.DataFrame(results,columns=range(1,SSR_MAX_COUNT+1))
#执行概率计算并输出
final_result=CalculateSteps(MAX_STEPS,SSR_INSURANCE,SR_INSURANCE,GOLD_CAST)
# 绘图代码
from copy import deepcopy
import matplotlib.cm as cm
import numpy as np
import GGanalysis as gg
from GGanalysis.gacha_plot import quantile_function
# plt.plot(final_result[7].values)
# plt.show()
# exit()
# 抽n个物品最多使用多少抽
def get_most_pull(n):
core = 0
pull = 0
items = 0
while True:
pull += 1
core += 1
if pull % SSR_INSURANCE_LIMIT == 0 or pull % SR_INSURANCE_LIMIT == 0:
core += 1
if core >= SSR_PRICE_GOLD_CAST:
core %= SSR_PRICE_GOLD_CAST
items += 1
if items >= n:
return pull
# 构成绘图程序所需格式
ans_list = [gg.finite_dist_1D([1])]
for i in range(1, SSR_MAX_COUNT+1):
ans = deepcopy(final_result.values)
ans[1:] = ans[:-1]
dist = final_result.values - ans
dist = dist[:get_most_pull(i)+1]
# print(sum(final_result.values[get_most_pull(i):]))
dist = gg.finite_dist_1D(dist)
dist.p_normalization()
print(i, dist.exp, dist.exp/i)
ans_list.append(dist)
def Hotta_num(x):
return str(x-1)+'星'
# 幻塔限定SSR武器
Hotta_fig = quantile_function(
ans_list,
title='幻塔限定SSR武器抽取概率',
item_name='限定SSR武器',
text_head='本图中玩家SR全满破并记入铸金兑换\n不保证模型准确,本图结果仅供参考\n由于铸金兑换机制,谈论期望意义不大\n如想大概估计抽数,请参考图示概率\n此时获取一个道具最多需要110抽\n此时获取七个道具最多需要764抽\n计算@immortalcow\n绘图@一棵平衡树',
text_tail='',
max_pull=675,
mark_func=Hotta_num,
line_colors=0.5*(cm.Blues(np.linspace(0.1, 1, SSR_MAX_COUNT+1))+cm.Greys(np.linspace(0.4, 1, SSR_MAX_COUNT+1))),
y_base_gap=25,
y2x_base=3,
mark_exp=False,
mark_max_pull=False,
is_finite=True)
Hotta_fig.show_figure(dpi=300, savefig=True)
[/code]
【快讯】幻塔阿格蕾娅高定纯白契约今天上线截图
【快讯】幻塔阿格蕾娅高定纯白契约今天上线
今天中午12:00,《幻塔》阿格蕾娅高定系列皮肤纯白契约正式开启限时抽取,活动持续至3月19日04:59。 本次活动为有限池,抽取上限15次即可拿满全部奖励,首抽仅需90墨晶或30钛晶,抽取花费随次数依次递增。奖池包含阿格蕾娅拟态皮肤纯白契约、武器外观契约之心,还有纯白魔女礼盒与各类道具资源,开启礼盒可获得专属头像、头像框和聊天气泡。穿戴武器外观即可解锁高定专属技能特效,皮肤与武器外观需分别在拟态
4 赞
《幻塔》2025年度数据回顾截图
《幻塔》2025年度数据回顾
与塔同行四周年,幻想拾遗数据回顾,记录我们共同的幻想旅程。 未来一步一个脚印,与塔约定,继续携手前行~
官方
28 赞
9 回复
《幻塔》5.7「时之魔女」版本定档2月12日 全新内容抢先曝光截图
《幻塔》5.7「时之魔女」版本定档2月12日 全新内容抢先曝光
今日,《幻塔》官方发布5.7「时之魔女」版本速递,正式宣布该版本将于2月12日正式开启,为玩家带来全新剧情、角色与玩法内容。 本次「时之魔女」版本围绕全新拟态角色展开,官方在版本速递中透露,新拟态将以“时间”为核心设计元素,拥有独特的技能机制与背景故事,同时搭配专属武器与外观,为玩家带来全新战斗体验。此外,版本还将开放新地图区域、限时活动与剧情章节,进一步拓展艾达星的世界观与探索维度。 除了新角色
16 赞
虚无与梦境的坐标即将上线!新拟态格尔菲茵截图
虚无与梦境的坐标即将上线!新拟态格尔菲茵
幻塔6.2版本虚无与梦境的坐标将于7月2日正式更新,同步开放洛克哈特区域的全新浮空区域永恒岛。新拟态角色格尔菲茵同步登场,设定为永恒马戏团团长、自然意志幕后领袖,外表天真擅长杂技,看待生死时空拥有独到观点。限定武器仙女环及格尔菲茵意志将于7月2日12点至8月12日4点59分开启限时抽取。 永恒岛是一座悬浮于高空的浮空狂欢之城,包含多层垂直探索结构,玩家可通过新载具与滑翔机制在浮空建筑间穿梭,探索过
1 回复
【梦幻模拟战】[攻略心得] 周五安酱协力一回合但不稳定版(补了个不成功版的视频 更新了点位测试)截图
【梦幻模拟战】[攻略心得] 周五安酱协力一回合但不稳定版(补了个不成功版的视频 更新了点位测试)
原帖是大佬发布在NGA的攻略贴,个人在使用过程中受益颇多,申请搬运到taptap供大家使用。不做任何商业用途,如有侵权,我会立即删除本帖。 [攻略心得] 周五安酱协力一回合但不稳定版(补了个不成功版的视频 更新了点位测试) 阵容配置:双黑妮 女司机 露娜 茉 坦克 神契:奥丁 打法简述:一般先动女司机 之后的顺序比较随意 召唤奥丁带所有人往下 收3步兵配合茉传左下树收5小只 2个黑妮负责让安酱到达
3 赞
7 回复
幻塔6.2版本定档!新拟态7月2日上线截图
幻塔6.2版本定档!新拟态7月2日上线
《幻塔》6.2版本「虚无与梦境的坐标」定于7月2日正式更新,同步开放洛克哈特全新浮空区域“永恒岛”。这座岛屿悬浮于洛克哈特区域的高空,包含多层垂直探索结构,玩家可通过新载具与滑翔机制在浮空建筑间穿梭,探索过程中可触发支线剧情,推进永恒马戏团与自然意志阵营的主线故事。 全新拟态角色“格尔菲茵”同步登场,设定为永恒马戏团团长、自然意志的幕后领袖。外表纯真天真,擅长杂技表演,对死亡与时空拥有独到见解,依
投票
3 赞
1 回复
【游戏王:大师决斗】[卡组推荐] 0废件的FTK玩过吗?朋克单卡转晶气能FTK截图
【游戏王:大师决斗】[卡组推荐] 0废件的FTK玩过吗?朋克单卡转晶气能FTK
原帖是大佬发布在NGA的攻略贴,个人在使用过程中受益颇多,申请搬运到taptap供大家使用。不做任何商业用途,如有侵权,我会立即删除本帖。 [卡组推荐] 0废件的FTK玩过吗?朋克单卡转晶气能FTK 前言 大家好我又来了,上次写了个神碑科怪FTK的攻略贴,承蒙大家关爱,随着科怪的禁止那个攻略也大结局了 但是,贼心不死的我怎么会就此退缩 今天就给大家带来一套我认为玩起来更加丝滑的FTK卡组 ====
2 赞
【漫威对决】S21 赛季攻略征集开始,攻略后在本帖回复相关攻略链接即有机会获得以下奖励!截图
【漫威对决】S21 赛季攻略征集开始,攻略后在本帖回复相关攻略链接即有机会获得以下奖励!
原帖是大佬发布在NGA的攻略贴,个人在使用过程中受益颇多,申请搬运到taptap供大家使用。不做任何商业用途,如有侵权,我会立即删除本帖。 S21 赛季攻略征集开始,攻略后在本帖回复相关攻略链接即有机会获得以下奖励! 新赛季漫威对决攻略征集活动已开启,只要你有好的构造心得、玩法思路以及开包氪金指导、新卡评测,S21赛季内在NGA来发贴发攻略并在本帖下回复攻略链接就有机会获得以下奖励! 活动奖励 一
【世界弹射物语】[活动盘]百兽王冠水直击铃铛盘推荐截图
【世界弹射物语】[活动盘]百兽王冠水直击铃铛盘推荐
原帖是大佬发布在NGA的攻略贴,个人在使用过程中受益颇多,申请搬运到taptap供大家使用。不做任何商业用途,如有侵权,我会立即删除本帖。 [活动盘]百兽王冠水直击铃铛盘推荐 已知我带了双驱,炸C之后boss还有两个攻击上升,请问队友带了几个驱散.jpg 鉴于4个buff被驱散掉之后会有高额直击易伤,推荐还是双驱直击队伍打铃铛,只要驱掉buff就是十几秒的盘,不会像技伤那么吃队友,一轮踢不掉就要一
2 赞
4 回复
【漫威对决】S21 赛季冲榜后本帖回复冲榜卡组玩法可获得最高300星钻+卡背奖励截图
【漫威对决】S21 赛季冲榜后本帖回复冲榜卡组玩法可获得最高300星钻+卡背奖励
原帖是大佬发布在NGA的攻略贴,个人在使用过程中受益颇多,申请搬运到taptap供大家使用。不做任何商业用途,如有侵权,我会立即删除本帖。 S21 赛季冲榜后本帖回复冲榜卡组玩法可获得最高300星钻+卡背奖励 NGA赛季常驻冲榜征集奖励活动开始,冲榜后回复本帖发送冲榜卡组心得即可获得最高300星钻+卡背奖励!且天梯榜一至榜三参与本活动还可直接进入下一期内鬼赛! 注:回贴需回复赛季+冲榜卡组核心玩法
2 赞