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
直方图如下:

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
直方图如下:
