尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
原神抽卡数据分析:从祈愿日志到概率建模与保底验证
简介这份资源是面向游戏数据分析爱好者、概率论研究者与游戏经济方向学者的原神祈愿抽卡记录数据集聚焦游戏内Gacha机制的真实抽取日志可用于验证官方概率、分析用户消费习惯与抽卡行为模式。压缩包共717个文件以691个csv抽卡记录为主体辅以Python脚本、Markdown说明、JSON配置、SVG图表及npy数组等整体约145.42MB目录按玩家索引与卡池编号组织便于按需筛选与批量处理。目前已有288人学习下载。读者可借助时间戳、玩家ID、卡池类型与星级结果等字段复现五星出货率、研究十连抽现象、观察版本更新与限时活动对祈愿频率的影响并结合社区反馈探讨热门角色发布带来的行为波动为游戏优化、留存策略与概率设计提供实证参考。1. 原神抽卡记录数据集从祈愿日志到可复现的概率分析抽卡这件事玄学归玄学但只要你愿意把祈愿历史导出成结构化数据它立刻变成一道可以算的数学题。GenshinImpactgachadata.zip这类数据集核心价值不是晒欧而是把成千上万条祈愿记录变成可统计、可建模、可复现的样本池。它通常包含角色活动祈愿、武器活动祈愿、常驻祈愿的抽取时间、物品名称、星级、保底计数等字段格式多为 CSV 或 JSON。适合谁用想验证官方公示概率是否吻合的玩家、做抽卡模拟器的开发者、想练手数据分析的新手以及做原神 AI 助手、云原神适配脚本时需要真实分布做输入的同学。这一章先把这是什么、能解决什么讲清楚后面几章带你从零跑通清洗、统计、可视化到保底建模的完整链路。2. 数据集结构拆解与字段语义对齐拿到一个GenshinImpactgachadata.zip第一件事不是急着跑统计而是把字段语义对齐。不同来源的导出工具字段命名差异很大常见的有gacha_type、item_name、rank_type、time、pity这几类。如果字段理解错了后面所有概率都会偏。2.1 祈愿类型与卡池编号的对应关系原神的祈愿类型在日志里通常用数字编码表示这是最容易踩坑的地方。常见映射如下表但要注意不同导出工具可能用字符串代替数字导入后先做一次类型分布检查。gacha_type卡池名称是否计入保底备注100常驻祈愿奔行世间是无 UP独立保底200新手祈愿是仅限新手次数有限301角色活动祈愿是与 400 共享保底计数400角色活动祈愿-2是双 UP 池与 301 共享302武器活动祈愿是定轨机制独立计算这里的关键点是301 和 400 的保底是共享的如果你把它们分开统计会得出两个池子各自保底的错误结论。武器池的定轨命定值是另一套逻辑不能和角色池混在一起算。2.2 用 pandas 做一次字段体检导入后先跑一段体检代码确认字段类型、缺失值和分布这一步能省掉后面大量返工。import pandas as pd # 读取 CSV注意编码部分导出工具用 utf-8-sig 带 BOM df pd.read_csv(gacha_data.csv, encodingutf-8-sig) # 统一列名兼容不同导出工具的命名 rename_map { item_name: item, rank_type: rarity, gacha_type: pool, time: ts } df df.rename(columns{k: v for k, v in rename_map.items() if k in df.columns}) # 字段体检类型、缺失、唯一值 print(df.dtypes) print(df.isnull().sum()) print(df[pool].value_counts()) print(df[rarity].value_counts()) # 时间字段转 datetime方便后续按版本/日期切分 df[ts] pd.to_datetime(df[ts], errorscoerce) print(df[ts].isnull().sum()) # 转换失败的行数必须为 0 才能继续逻辑说明encodingutf-8-sig是为了处理带 BOM 的文件否则第一列列名会带一个不可见字符导致df[pool]报 KeyError。errorscoerce把无法解析的时间变成 NaT方便你统计有多少脏数据。参数上rename_map只对存在的列生效避免不同数据集列名不一致时直接报错。提示如果pool列是字符串如 301先df[pool] df[pool].astype(int)再对照上面的映射表否则分组统计会得到一堆字符串分组。2.3 保底计数字段是自算还是自带有些数据集自带pity字段有些没有需要你自己按时间顺序累加。自带的不一定可信因为导出工具可能把 301 和 400 分开计数。稳妥做法是自己重算一遍和自带字段对比差异大的行重点排查。# 按时间排序后对角色池301400重算保底计数 df df.sort_values(ts).reset_index(dropTrue) char_pools df[df[pool].isin([301, 400])].copy() # 五星出现的位置重置计数其余累加 char_pools[pity_calc] 0 counter 0 for idx, row in char_pools.iterrows(): counter 1 char_pools.at[idx, pity_calc] counter if row[rarity] 5: counter 0 # 出五星后重置 print(char_pools[pity_calc].describe())这段代码的核心是出五星即重置的累加逻辑。counter在每次循环先加一再判断是否重置保证五星那一抽的 pity 值就是它实际消耗的抽数。如果你发现pity_calc最大值超过 90说明数据里有重复记录或排序有问题需要回去查ts字段。3. 从原始日志到概率分布清洗与统计实操数据体检通过后进入真正的分析环节。这一章的目标是产出一份可信的概率分布包括五星综合概率、UP 命中率、平均出货抽数。这些数字直接决定你后面做的模拟器或 AI 助手靠不靠谱。3.1 去重、补全与异常记录剔除原始日志最常见的三类脏数据重复记录同一抽被导出两次、时间倒序导出工具排序问题、缺失星级。处理顺序很重要先去重再排序否则排序会把重复记录打乱位置。# 去重以 时间物品名池子 作为唯一键 before len(df) df df.drop_duplicates(subset[ts, item, pool], keepfirst) print(f去重删除 {before - len(df)} 行) # 剔除星级缺失的行 df df[df[rarity].notnull()] # 再次确认时间单调性 df df.sort_values(ts).reset_index(dropTrue) assert df[ts].is_monotonic_increasing, 时间仍非单调检查是否有跨时区记录drop_duplicates的subset选择很关键。只用ts去重会误删同一秒内的多抽十连常见加上item和pool才能准确定位重复。keepfirst保留最早出现的记录因为导出工具通常按原始顺序写入。3.2 五星综合概率与 UP 命中率的计算官方公示的角色池五星综合概率约 1.6%但这个数字包含了保底机制。要验证它你需要用总五星数 / 总抽数来算而不是只看非保底区间的概率。# 角色池综合概率 char df[df[pool].isin([301, 400])] total_pulls len(char) five_stars char[char[rarity] 5] comprehensive_rate len(five_stars) / total_pulls print(f角色池总抽数 {total_pulls}五星数 {len(five_stars)}综合概率 {comprehensive_rate:.4f}) # UP 命中率需要知道哪些五星是 UP 角色 # 假设数据集有 is_up 字段没有的话用物品名白名单匹配 up_names {胡桃, 夜兰, 纳西妲} # 按你数据集的卡池实际 UP 替换 five_stars five_stars.copy() five_stars[is_up] five_stars[item].isin(up_names) up_rate five_stars[is_up].mean() print(f五星 UP 命中率 {up_rate:.4f})comprehensive_rate应该落在 0.015 到 0.020 之间样本量小于 1000 抽时波动会很大别急着下结论。up_rate的理论值约 0.5大小保底各半如果你的数据算出来偏离超过 0.1先检查up_names是否覆盖了所有 UP 角色漏掉一个就会拉低命中率。3.3 出货抽数分布与保底区间验证比综合概率更有价值的是出货抽数的分布。把每次五星之间的抽数差提取出来画成直方图你能直观看到保底在 90 抽附近的堆积。# 提取每次五星消耗的抽数 char char.sort_values(ts).reset_index(dropTrue) pity_list [] counter 0 for _, row in char.iterrows(): counter 1 if row[rarity] 5: pity_list.append(counter) counter 0 import numpy as np pity np.array(pity_list) print(f平均出货抽数 {pity.mean():.2f}) print(f中位数 {np.median(pity):.0f}) print(f90 抽以上占比 {(pity 90).mean():.4f}) # 应该接近 0 print(f75-90 抽占比 {((pity 75) (pity 90)).mean():.4f})pity.mean()的理论期望约 62 抽左右含保底。pity 90的占比必须接近 0如果明显大于 0说明你的重置逻辑有 bug或者数据里混入了常驻池记录。75-90区间的占比能反映软保底的陡增效应正常应该在 0.3 以上。注意样本量少于 500 抽时这些统计量的置信区间很宽建议至少积累 1000 抽以上再做结论否则就是自欺欺人。4. 可视化与保底建模让数据开口说话统计数字有了但要让别人信服或者要喂给原神 AI 助手做训练可视化和小型模型是绕不开的。这一章做两件事画出能直接放进报告的图以及用一个简单的马尔可夫链模拟保底过程。4.1 用 matplotlib 画出货抽数直方图直方图是最直观的验证工具。把 pity 分布画出来保底的台阶效应一目了然。import matplotlib.pyplot as plt import matplotlib # 中文字体设置否则中文标签会显示方块 matplotlib.rcParams[font.sans-serif] [SimHei] matplotlib.rcParams[axes.unicode_minus] False fig, ax plt.subplots(figsize(10, 5)) ax.hist(pity, binsrange(1, 95, 2), edgecolorblack, alpha0.7) ax.axvline(75, colororange, linestyle--, label软保底起点 75) ax.axvline(90, colorred, linestyle--, label硬保底 90) ax.set_xlabel(出货消耗抽数) ax.set_ylabel(次数) ax.set_title(角色池五星出货抽数分布) ax.legend() plt.tight_layout() plt.savefig(pity_dist.png, dpi150)binsrange(1, 95, 2)每 2 抽一个桶既能看出分布形状又不会太碎。两条竖线标出软保底和硬保底位置方便对照。如果你的图在 75 之前几乎是平的、75 之后陡增说明数据和官方机制吻合。4.2 用马尔可夫链模拟保底过程想验证给定当前保底计数下一抽出五星的概率可以建一个简单的状态转移模型。状态就是当前 pity 值转移概率从你的数据里估计。# 从数据估计每个 pity 值下的出五星概率 from collections import defaultdict state_total defaultdict(int) state_five defaultdict(int) counter 0 for _, row in char.iterrows(): counter 1 state_total[counter] 1 if row[rarity] 5: state_five[counter] 1 counter 0 # 计算转移概率拉普拉斯平滑避免除零 probs {} for s in range(1, 91): total state_total.get(s, 0) five state_five.get(s, 0) probs[s] (five 1) / (total 2) # 平滑 # 模拟 10000 次抽卡验证平均抽数 import random def simulate_once(): pity 0 while True: pity 1 p probs.get(pity, 1.0 if pity 90 else 0.006) if random.random() p: return pity sims [simulate_once() for _ in range(10000)] print(f模拟平均抽数 {np.mean(sims):.2f})state_total和state_five统计每个 pity 值出现的总次数和出五星次数比值就是该状态的经验概率。拉普拉斯平滑(five 1) / (total 2)防止某个 pity 值样本为零时概率为 0。probs.get(pity, ...)的兜底逻辑保证 90 抽必出。模拟结果和实际pity.mean()对比差异在 2 抽以内说明模型可信。4.3 把分布导出成 AI 助手可用的格式如果你在做原神 AI 助手需要把概率分布存成 JSON 供推理时查询。格式要简洁键是 pity 值值是概率。import json # 导出为 JSON保留 4 位小数 export {str(k): round(v, 4) for k, v in probs.items()} with open(pity_probs.json, w, encodingutf-8) as f: json.dump(export, f, ensure_asciiFalse, indent2) print(f已导出 {len(export)} 个状态的概率)ensure_asciiFalse保证中文不被转义indent2方便人工检查。这个 JSON 可以直接被云原神适配脚本或 AI 助手加载做实时概率提示。5. 避坑与排查抽卡数据分析里最容易翻车的五件事这一章是我自己踩过的坑按现象 → 原因 → 解决写每条都对应真实会遇到的场景。现象综合概率算出来 3% 以上明显偏高。原因把常驻池和新手池的记录混进了角色池统计或者去重没做干净同一抽被算了两次。 解决先按pool字段过滤只保留 301 和 400再用ts item pool三字段去重确认去重前后行数差异。现象pity 最大值超过 90。原因时间排序错误导致重置逻辑在错误的顺序上执行或者数据里混入了武器池记录武器池保底是 80 抽但和角色池混算会乱。 解决df.sort_values(ts)后加assert df[ts].is_monotonic_increasing严格按pool分组后再算 pity不要跨池累加。现象UP 命中率算出来只有 0.2 或 0.8。原因up_names白名单不完整漏掉了部分 UP 角色或者把常驻五星如迪卢克、琴误判为 UP。 解决从卡池公告里核对当期 UP 名单常驻五星单独建一个集合排除如果数据集有is_up字段优先用它但要抽查几行确认可信。现象直方图在 90 抽之后还有一堆数据。原因数据里包含了垫抽记录即玩家在非目标池抽的卡被错误归入或者导出工具把保底计数写成了累计值而非重置值。 解决检查pity字段的来源如果是自带的和自己重算的对比差异大的行单独看原始日志必要时只保留自己重算的pity_calc。现象模拟出来的平均抽数和实际差很多。原因概率估计时样本量太小某些 pity 区间的经验概率失真或者平滑参数设置不当把真实的高概率区间压平了。 解决样本少于 1000 抽时不要做状态级建模改用分段常数模型如 1-73 抽固定 0.00674-90 递增平滑只在样本为零时生效样本充足时直接用经验频率。提示每次清洗后都打印一遍关键统计量总抽数、五星数、综合概率、pity 均值和上一次对比突变就是 bug 信号。6. 进阶技巧用分层抽样验证小样本下的概率稳定性最后一个技巧解决一个实际问题当你只有几百抽数据时怎么判断算出来的概率是不是靠谱答案是分层抽样加置信区间。不要只看点估计要看区间。具体做法把数据按时间切成若干段比如每 100 抽一段每段单独算综合概率然后看这些段间概率的波动范围。如果波动很大说明样本不够结论不可信。# 分层抽样每 100 抽为一段计算段内综合概率 char char.reset_index(dropTrue) char[segment] char.index // 100 seg_stats char.groupby(segment).apply( lambda g: pd.Series({ pulls: len(g), fives: (g[rarity] 5).sum(), rate: (g[rarity] 5).mean() }) ) print(seg_stats) # 段间概率的标准差越小越稳定 print(f段间概率标准差 {seg_stats[rate].std():.4f})segment用整数除法切分每段 100 抽。groupby后算每段的五星率和抽数。段间标准差如果小于 0.005说明你的数据量足够支撑结论如果大于 0.01建议继续积累数据或者只报告区间而不是点估计。另一个进阶用法是把这份分布接入原神自动抽卡模拟器做蒙特卡洛批量模拟输出抽到目标角色所需抽数的 90% 分位数。这个数字比平均值更有决策价值因为它告诉你最坏情况下要准备多少抽。# 蒙特卡洛模拟 50000 次输出抽到 UP 角色的抽数分位数 def simulate_until_up(): pity 0 guaranteed False # 是否大保底 pulls 0 while True: pulls 1 pity 1 p probs.get(pity, 1.0 if pity 90 else 0.006) if random.random() p: # 出五星判断是否 UP if guaranteed or random.random() 0.5: return pulls guaranteed True pity 0 if pity 90: if guaranteed or random.random() 0.5: return pulls guaranteed True pity 0 results [simulate_until_up() for _ in range(50000)] print(f50% 分位 {np.percentile(results, 50):.0f} 抽) print(f90% 分位 {np.percentile(results, 90):.0f} 抽) print(f99% 分位 {np.percentile(results, 99):.0f} 抽)guaranteed标记大保底状态出非 UP 五星后置为 True下次五星必为 UP。pity 90的兜底保证硬保底生效。分位数比平均值有用得多——90% 分位告诉你九成情况下这些抽数够用这才是做资源规划时该看的数字。我自己现在的习惯是每拿到一份新的GenshinImpactgachadata.zip先跑一遍第 2 章的体检代码再跑第 3 章的统计最后用第 6 章的分层抽样确认稳定性三步走完才敢把结论写进报告。这套流程帮我省掉了至少三次因为数据脏而得出错误概率的翻车。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

Unity DOTS万人同屏实战:ECS架构与性能优化全解析

Unity DOTS万人同屏实战:ECS架构与性能优化全解析

1. 万人同屏方案的整体设计思路拆解1.1 为什么传统 GameObject 方案撑不住一万人先把结论摆在前面:用传统的 GameObject MonoBehaviour 那套写法,想在消费级 PC 上跑一万个带渲染、带动画、带逻辑的实体,基本是没戏的。这不是代码写得烂不烂…

📅 2026/10/3 4:51:40
Windows 11开始菜单又慢又乱?OpenShell替换教程,打造高效经典布局

Windows 11开始菜单又慢又乱?OpenShell替换教程,打造高效经典布局

Windows 11 的开始菜单,是我这几年见过最不务正业的一个。点开它,占据C位的往往不是你要找的程序,而是"推荐的项目"——一堆热点资讯、最近打开的文件,甚至时不时弹出来的应用推广位。想找控制面板要先翻页,…

📅 2026/10/3 4:51:40
重庆DEM 30米分辨率实战:从坡度坡向到汇流避坑指南

重庆DEM 30米分辨率实战:从坡度坡向到汇流避坑指南

简介:这份资源是面向GIS、遥感及地形分析学习者的重庆市30米分辨率数字高程模型数据包,基于ASTER GDEM V3全球数据集自行拼接裁剪而成,可直接用于城市规划、地质灾害评估、水文模拟、交通选线等场景,适合具备一定GIS基础的中高级用…

📅 2026/10/3 4:51:40
MORE NEWS

更多资讯

📰

大模型千卡推理集群架构:等开销负载均衡实战

1. 项目概述:这不是在搭服务器,是在给大模型修一条高速公路“大模型推理集群架构设计:从单卡推理到千卡负载均衡”——这个标题里藏着三个关键动作:“修路”(架构设计)、“提速”(单卡→千卡&am…

📰

大模型Agent记忆系统设计实战:从无状态到有状态

1. 为什么Agent必须有自己的记忆1.1 从"无状态"到"有状态":Agent记忆的本质这两年我做了不少Agent项目,最深的体会是:很多人一上来就堆功能、接工具、画编排图,结果做出一个"每次对话都失忆"的机器…

📰

生成式AI模型优化赛:ControlNet推理加速实战,延迟降低3倍

1. 赛题背景与方案整体思路拆解1.1 这个比赛到底在比什么先说说这个比赛的定位。生成式AI模型优化赛,核心考察的不是谁模型训得好,而是谁能在给定硬件条件下把已有模型的推理性能压榨到极致。说白了,模型精度是主办方给的,你要做的…

📰

UE5不靠超分辨率也能3倍提帧:原生渲染优化实战

先说明:我不打算在文章里和谁吵架,也不打算证明“超分辨率无用”。本文想做的事情很简单——把一个 UE5 项目放到“原生渲染分辨率”下,通过一系列渲染配置、场景设置和资源层面的优化,把帧率从约 30fps 提到接近 90fps。这个结果…

📰

从零手写Transformer与AI训练推理:完整工程实践指南

一直有个执念:与其天天调现成框架的API,不如亲手把AI系统从零攒出来一次。这个项目就是我过去几个月的完整记录。从数据清洗、分词器,到Transformer核心模块、训练循环、推理部署,我不使用任何现成的深度学习框架来组装模型逻辑&a…

📰

AI应用底座:从试验到生产力,企业AI落地的关键基础设施

1. 从一堆"AI试点项目"到真正的生产力:QuickBlue在解决什么过去两年我见过太多这样的企业:年初高调宣布成立AI专项小组,年中把ChatGPT、文心一言、通义千问的API全部接入了一遍,年底复盘时却发现,真正跑进业…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬