Fate Grand/Order 官方抽卡数据统计

没错,就是CBA池子沉了

结论:SR和SSR的出货概率符合官方公示的数据,只是我运气太差了

19年8月30日晚7点,坐标上海唐镇,马路上一弱智掏出手机领完3周年签到补贴300石头后开始抽卡,10S后抽卡结束,没有看到CBA。

我抽了,1秒十连有什么好说的,一定是阿B在后台动了出货概率!

我一定要调查清楚,不出货肯定不是我的原因。
这时候想起了Fgo的B站官网有个实时滚动的出货信息,打开Chrome,F12查看调试信息。
得到如下两个链接,

那么开始编写代码吧,Pycharm启动


跑了不知道多长时间以后,得到了169911条数据。
下面对这些数据进行一些统计

![](https://github.com/chaosgoo/blog_pic/blob/master/oss_backup/blog_pic/fgo-summon-stats/SSR_Record.jpg?raw=true

![](https://github.com/chaosgoo/blog_pic/blob/master/oss_backup/blog_pic/fgo-summon-stats/SR_Record.jpg?raw=true

其中SSR有41496条记录,而SR有128415,由于没有SR的记录,也没有礼装的记录,能做的就是计算出SR和SSR比值,
41496 ÷ 128415 ≈ 0.32313982011447260834014717906787

而官网给出的数据是

四星从者和五星从者的出货比应该是1:3,和41496:128415非常接近,所以fgo的出货率理论上说并没有问题。
但是有了这些数据,不妨再做些其他有意识的事情,比如下表。

服务器 数量 所占比例
安卓bilibili服 125103 73.6%
安卓联运服 7188 4.2%
ios服 37620 22.1%

附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import requests
import sqlite3
import time

# 在进行查询请求前需要访问的一个链接
beforeQuery = "https://message.bilibili.com/api/tooltip/query.list.do"
# 查询抽卡情况的链接
summonDataUrl = "https://activity.biligame.com/board/list"
# 查询参数,游戏id
game_id = 112
# 查询参数游戏key
game_key = "a5f36e53ab3b0c41"
# 未知参数
rows = 31
# 查询参数payload
payload = {
'game_id': game_id,
'game_key': game_key,
'rows': rows
}


class SummonData:
# id 相当于所有玩家按照顺序抽中的编号
# sname 服务器
# rname 玩家昵称
# info 抽中从者名称
# star 从者等级
def __init__(self, id, sname, rname, info, star):
self._id = id
self._sname = sname
self._rname = rname
self._info = info
self._star = star

def insert(self, cursor):
if cursor:
cursor.execute('select * from SUMMON where id=?', (self._id,))
# 判断查询到的结果是否有重复
query_result_counter = len(cursor.fetchall())
# 如果没有重复则说明允许插入
if query_result_counter == 0:
cursor.execute(
"""insert into SUMMON (id, sname, rname, info, star) values ({},"{}","{}","{}","{}")""".format(
self._id,
self._sname,
self._rname,
self._info,
self._star))
print('Insert Done! {}, {}, {}, {}, {}'.format(self._id,
self._sname,
self._rname,
self._info,
self._star))
else:
print("重复记录")


def getDataFromNetWork():
b = requests.get(beforeQuery)
if b.json()['code'] == 0:
r = requests.get(params=payload, url=summonDataUrl)
return r.json()
return {'code': 0, 'data': []}


def createTable():
conn = sqlite3.connect('fgo.db')
cursor = conn.cursor()
print('Start Create Table')
cursor.execute('''CREATE TABLE SUMMON
(ID INT NOT NULL,
SNAME CHAR(16) NOT NULL,
RNAME CHAR(16) NOT NULL,
INFO CHAR(16),
STAR CHAR(8));''')
conn.commit()
conn.close()


# createTable() # 创建完成后续无需再次调用


if __name__ == '__main__':
conn = sqlite3.connect('fgo.db')
cursor = conn.cursor()
# 请求次数
request_counter = 1
# 请求间隔,同时是一个倒计时器, 单位秒(S)
request_interval = 30
while True:
if request_interval == 30:
content = getDataFromNetWork()
if len(content['data']) > 0:
for record in content['data']:
summondata = SummonData(int(record['id']), record['sname'], record['rname'], record['info'],
record['star'])
summondata.insert(cursor)
conn.commit()
request_counter += 1
request_interval = 0
time.sleep(1)
print("Next Request ETA: {}|Current Time: {}".format(30 - request_interval,
time.asctime(
time.localtime(time.time()))))
request_interval += 1

阅读量: