晶核吧 关注:57,744贴子:1,322,485

写了一个晶核强化的概率算法

只看楼主收藏回复

import math
import random
# 计算给定C值下,最小成功范围的平均成功率
def PFromC(c):
dPE = 0
dPreSuccessP = 0
nMaxFail = math.ceil(1 / c)
for i in range(1, nMaxFail + 1):
dCurP = min(1, i * c) * (1 - dPreSuccessP)
dPreSuccessP += dCurP
dPE += i * dCurP
return 1 / dPE
# 根据给定的成功率,计算PRD算法中的系数C
def CFromP(p):
dUp = p
dLow = 0
dPLast = 1
while True:
dMid = (dUp + dLow) / 2
dPtested = PFromC(dMid)
if abs(dPtested - dPLast) <= 0.00005:
break
if dPtested > p:
dUp = dMid
else:
dLow = dMid
dPLast = dPtested
return dMid
# 装备强化算法
class EquipmentEnhancement:
def __init__(self):
self.H = 0
self.N = 1
random.seed = 2023
def enhance(self, S=0.2):
C = CFromP(S)
Nmax = math.ceil(1 / C)
P_N_L_S = C + self.H
# 判断当前强化是否成功
is_success = random.random() < P_N_L_S
n = self.N
if is_success:
self.N = 1 # 重置失败次数
self.H = 0 # 重置历史累计概率
else:
self.N += 1 # 增加失败次数
self.H += C # 累计概率增量
return P_N_L_S, Nmax, is_success, n
import matplotlib.pyplot as plt
# 这里假设你的EquipmentEnhancement类和enhance方法已经定义好了
enhancer = EquipmentEnhancement()
failures = []
total_n = 0
level = 10
# 运行100次每次成功算一次循环
for i in range(100):
# 运行强化循环,直到成功
while True:
actual_prob, Nmax, is_success, n = enhancer.enhance()
total_n += 1
if is_success:
# 记录连续失败的次数
failures.append(n)
break
print(f'强化总次数为:{total_n},总成功概率为:{len(failures) / total_n}')
# 创建直方图
plt.hist(failures, bins=range(0, max(failures) + 2), edgecolor='black', align='left')
plt.xlabel('error_count')
plt.ylabel('success_count')
plt.title(f'{level} P_hist')
plt.show()
def main(enhancer, total_n=0):
print("按下回车键开始强化。输入'q'然后按回车键退出。")
failures = []
while True:
user_input = input()
if user_input == 'q':
break
total_n += 1
actual_prob, Nmax, is_success, n = enhancer.enhance()
print(f'当前概率:{actual_prob * 100}%, 当前最大失败次数:{Nmax}, 当前强化是否成功:{is_success}, 强化次数{n}')
if is_success:
failures.append(n)
print(f'强化总次数为:{total_n},总成功概率为:{len(failures) / total_n}')
# 创建直方图
plt.hist(failures, bins=range(0, max(failures) + 2), edgecolor='black', align='left')
plt.xlabel('error_count')
plt.ylabel('success_count')
plt.title(f'{level} P_hist')
plt.show()
# 如果你想在退出循环后显示直方图,可以在这里添加相应代码
if __name__ == "__main__":
enhancer = EquipmentEnhancement()
main(enhancer)
最终结果:
循环100次强化到成功为止:结果是强化总次数为:528,总成功概率为:0.1893939393939394
成功连续失败次数直方图:

手动通过main 回车跑了48次,结果是:强化总次数为:48,总成功概率为:0.22916666666666666
历史打印:
当前概率:5.56884765625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数1
当前概率:11.1376953125%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数2
当前概率:16.70654296875%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数3
当前概率:22.275390625%, 当前最大失败次数:18, 当前强化是否成功:True, 强化次数4
当前概率:5.56884765625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数1
当前概率:11.1376953125%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数2
当前概率:16.70654296875%, 当前最大失败次数:18, 当前强化是否成功:True, 强化次数3
当前概率:5.56884765625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数1
当前概率:11.1376953125%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数2
当前概率:16.70654296875%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数3
当前概率:22.275390625%, 当前最大失败次数:18, 当前强化是否成功:True, 强化次数4
当前概率:5.56884765625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数1
当前概率:11.1376953125%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数2
当前概率:16.70654296875%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数3
当前概率:22.275390625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数4
当前概率:27.84423828125%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数5
当前概率:33.4130859375%, 当前最大失败次数:18, 当前强化是否成功:True, 强化次数6
当前概率:5.56884765625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数1
当前概率:11.1376953125%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数2
当前概率:16.70654296875%, 当前最大失败次数:18, 当前强化是否成功:True, 强化次数3
当前概率:5.56884765625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数1
当前概率:11.1376953125%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数2
当前概率:16.70654296875%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数3
当前概率:22.275390625%, 当前最大失败次数:18, 当前强化是否成功:True, 强化次数4
当前概率:5.56884765625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数1
当前概率:11.1376953125%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数2
当前概率:16.70654296875%, 当前最大失败次数:18, 当前强化是否成功:True, 强化次数3
当前概率:5.56884765625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数1
当前概率:11.1376953125%, 当前最大失败次数:18, 当前强化是否成功:True, 强化次数2
当前概率:5.56884765625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数1
当前概率:11.1376953125%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数2
当前概率:16.70654296875%, 当前最大失败次数:18, 当前强化是否成功:True, 强化次数3
当前概率:5.56884765625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数1
当前概率:11.1376953125%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数2
当前概率:16.70654296875%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数3
当前概率:22.275390625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数4
当前概率:27.84423828125%, 当前最大失败次数:18, 当前强化是否成功:True, 强化次数5
当前概率:5.56884765625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数1
当前概率:11.1376953125%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数2
当前概率:16.70654296875%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数3
当前概率:22.275390625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数4
当前概率:27.84423828125%, 当前最大失败次数:18, 当前强化是否成功:True, 强化次数5
当前概率:5.56884765625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数1
当前概率:11.1376953125%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数2
当前概率:16.70654296875%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数3
当前概率:22.275390625%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数4
当前概率:27.84423828125%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数5
当前概率:33.4130859375%, 当前最大失败次数:18, 当前强化是否成功:False, 强化次数6
直方图如下:


IP属地:上海1楼2023-08-14 14:06回复
    这个工具可以帮你推演 伪随机算法的概率


    IP属地:上海3楼2023-08-14 14:10
    回复
      2025-06-26 18:35:54
      广告
      手动@策划


      IP属地:上海来自Android客户端4楼2023-08-14 14:10
      回复
        不明觉厉!


        IP属地:江西来自Android客户端5楼2023-08-14 14:10
        回复
          比如在多次强化后看到的图是,20%成功率的下,进行多次PRD算法进行模拟,结果是第5次成功的概率最大。100次强化成功的案例里,有20次是失败了4次,第5次才成功的。
          每一次强化后,都会用代码告诉你真实的概率,你可以选择继续垫,也可以切换到你的主装备进行强化。


          IP属地:上海6楼2023-08-14 14:16
          回复
            当然,我只是抛砖引玉,对于那种连续失败和连续成功,或许他的C计算是 1/ 装备等级 也说不定。


            IP属地:上海7楼2023-08-14 14:18
            回复
              嗯,说的好,俺认为也是这样


              IP属地:福建8楼2023-08-14 14:20
              回复
                最起码我的总体概率是符合正态分布的


                IP属地:上海9楼2023-08-14 14:21
                回复
                  2025-06-26 18:29:54
                  广告
                  看不懂,我是若至,所以结论是什么


                  IP属地:河南10楼2023-08-14 14:25
                  收起回复
                    也就是说垫4次失败,第5次成功的几率最大


                    IP属地:四川11楼2023-08-14 14:32
                    回复
                      elo机制,不会让你输的太惨的


                      IP属地:河南来自Android客户端12楼2023-08-14 14:36
                      回复
                        冰菓。我十四是这样上的。不过后来找了七件做垫子现在变成10了。


                        IP属地:广东来自Android客户端13楼2023-08-14 14:43
                        回复
                          也不太准吧。这下去试了。垫了九下都失败


                          IP属地:广东来自Android客户端14楼2023-08-14 14:49
                          收起回复
                            连续失败18次,第19次24上25,稳稳成功!!!!!!!


                            IP属地:广西15楼2023-08-14 14:53
                            回复
                              2025-06-26 18:23:54
                              广告
                              1000次成功的结果:x为连续失败次数,y为1000次成功里出现了多少次x下的成功次数
                              1000次成功,强化总次数为:4992,总成功概率为:0.20032051282051283


                              IP属地:上海16楼2023-08-14 15:22
                              回复