moonheart / mementomori-helper

メメントモリ MementoMori 游戏助手 Game Assistant ゲームアシスタント
GNU Lesser General Public License v2.1
74 stars 14 forks source link

快速戰鬥(未新增),打磨(已新增) #53

Closed hoshinomichi999 closed 7 months ago

hoshinomichi999 commented 9 months ago

1.打磨 打磨的目標值更改為占加總值百分比計算,而不是用絕對數值 使設定以及觀感上都有更好的體驗 例: 武器-柯迪專武 目標屬性-戰技 占比-55% 其中數值最大設定不超過60% (其實55%已經不好磨了,目測60%已經接近單一欄位上限 如果有方法得知上限,則使用該方法得出的資訊為準)

2.快速戰鬥 由於快速戰鬥基本上是遊戲中獲取資源性價比最高的功能 所以添加快速戰鬥可以設定次數的設定。

sacredcodex commented 9 months ago

前两天我统计了大概3000条数据,只讨论金币洗点。 记4项属性和为S,最小值逼近2/15 S(略大),反推最大值3/5 S。 根据Q群友所说,钻石可以突破这个范围,贫穷的我没有测试。 概率分布上,小的属性比大的属性更容易出现,目前我猜测是负指数分布,或者伽马分布。 这是我做的负指数分布拟合: image 概率公式: pdf(x) = 1/scale exp(-1/scale (x - loc)) 其中loc是最小值 2/15 S,loc + scale = 平均值 1/4 S。 在这个分布下,大于55%的概率约为3%,洗76次会有90%概率成功,151次有99%概率成功。 如果有大佬愿意帮忙,希望能够解释一下问题:

  1. 4个属性虽然都是右偏分布(更容易出现较小的值),但似乎不属于同一分布(上面拟合只是我自己用来参考打磨数据的),4种属性方差也相差比较大。
  2. 如果单独作为4个随机变量,属性和是不固定的,甚至在极小概率下,单值超过S,目前不清楚mmt算法是如何实现的。
moonheart commented 9 months ago

不太懂这个问题,提供一些信息作为参考

装备有个属性 AdditionalParameterTotal 表示四个属性和,具体的值可以在这里看到 mementomori-masterbook ;

单个属性是最大值是 60%,这是在游戏客户端代码里看到的;

群里有人说不同稀有度的装备,概率似乎也是不一样的,高稀有度的装备似乎更难打磨出目标值

sacredcodex commented 9 months ago

谢谢分享的表格。

EquipmentMB表格中,存在一列EquipmForgeId属性,应该对应了另一个表格EquipmentForgeMB。数值1\~6对应了装备稀有度从D\~S+的ForgeId。之后非副本掉落装备ForgeId都是0,在表格中没有。尽管id都是0,也有必要确认概率是否相同,之后几天我会多打磨确认一下。

根据之前issue中提到的,打磨似乎是客户端提交请求,数值是服务器给的,也就是客户端中不存在打磨的算法,我的理解是否正确?

moonheart commented 9 months ago

@sacredcodex 是的,客户端只提交请求,由服务端计算打磨

moonheart commented 9 months ago

新版 1.8.5 我修改了打磨的日志输出,看不到四属性的值,可以在 1.8.4 中进行测试

sacredcodex commented 9 months ago

坏了,刚更新

hoshinomichi999 commented 9 months ago

不是專業的,簡單提一下我的看法 1.雖然在打磨中4個屬性最大最小值一樣,但依據符石來看,4個屬性中,耐力相較於另外3個屬性低的,可能在不同屬性有不同的加權。

2.這有蠻多方法,像是正規化,直接裁減,或是不同定義域使用不同函數,也有可能不是經過一次的機率運算,而是先用f(x)決定A再g(A)決定4個屬性,這些方法都對分布(第1.點)有不同程度的影響。

sacredcodex commented 9 months ago

目前我完成了一种计算方法,在累积概率分布上和服务器返回值基本一致:

image

其中黄线是我的生成算法给出的属性的累积概率分布,蓝线是542条360级ssr鞋子打磨的属性分布。

虽然不能确定服务器上算法是否是这样,但我认为两者相差不大,可以提供一定的概率参考。

下面我会给出具体的计算方法:

# S (int) 武器的四项属性之和
# size (int) 打磨次数

random = np.random.RandomState()
nums = np.ones((size, 4))
for i in range(size):
    # 4个随机变量采样,p(x)=e^(-x)
    nums[i] = random.exponential(1,4)

# 先除以四个采样数值之和,然后乘总属性的 7/15,最后每项属性加上最小值,总属性的2/15
nums = nums / np.sum(nums, axis = 1).reshape(size,1)* 7 * S / 15 + 2 * S /15
return nums.astype(np.int32)

因为这个方法得到的已经不是相互独立的随机变量,对于概率分布也不好计算。我会根据大量的生成数据给出近似概率:

目标百分比 1次打磨成功率 10次打磨成功率 100次打磨成功率
50% 0.038 0.32110 0.97923
51% 0.02778 0.24552 0.94023
52% 0.0196 0.17959 0.86186
53% 0.01305 0.12310 0.73115
54% 0.0081 0.07811 0.55661
55% 0.00471 0.04611 0.376312

多次打磨成功率计算:1 - (1 - 1次成功率) ^ n 以上数据出自100,000次模拟上面算法生成结果