This commit is contained in:
2024-07-09 11:10:14 +08:00
parent 2f7e176d58
commit 81287a1496
9 changed files with 345 additions and 0 deletions
+105
View File
@@ -0,0 +1,105 @@
import random
import copy
import threading
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
def single_pull(no_six_pull_count=0):
x = random.randint(1, 100)
six_star_threshold = (no_six_pull_count - 50) * 2 if no_six_pull_count > 50 else 0
factor = (100 - (2 + six_star_threshold)) / 98
prob_list = [2 + six_star_threshold, 8 * factor, 50 * factor, 40 * factor]
sum_prob_list = [prob_list[0], prob_list[0] + prob_list[1], prob_list[0] + prob_list[1] + prob_list[2], prob_list[0] + prob_list[1] + prob_list[2] + prob_list[3]]
if 0 < x <= sum_prob_list[0]:
result = 6
elif sum_prob_list[0] < x <= sum_prob_list[1]:
result = 5
elif sum_prob_list[1] < x <= sum_prob_list[2]:
result = 4
else:
result = 3
if result == 6:
no_six_pull_count = 0
else:
no_six_pull_count += 1
return result, no_six_pull_count
def ten_pull(no_six_pull_count=0):
result_list = []
is_african = True
for i in range(10):
res, no_six_pull_count = single_pull(no_six_pull_count)
result_list.append(res)
if res > 4:
is_african = False
return result_list, no_six_pull_count, is_african
def run_simulation(total_pull=200):
ten_pull_count = int(total_pull / 10)
single_pull_count = ten_pull_count - ten_pull_count
no_six_pull_count = 0
african_count = 0
full_res_list = []
for i in range(ten_pull_count):
ten_pull_res, no_six_pull_count, is_african = ten_pull(no_six_pull_count)
full_res_list += copy.deepcopy(ten_pull_res)
if is_african:
african_count += 1
for i in range(single_pull_count):
single_res, no_six_pull_count = single_pull(no_six_pull_count)
six_star_list = [i for i in full_res_list if i == 6]
# pull_result = {'Result': full_res_list, 'african': african_count, 'six star count': len(six_star_list)}
pull_result = {'african': african_count, 'six star count': len(six_star_list)}
return pull_result
if __name__ == '__main__':
hit = 0
hit1 = 0
hit2 = 0
total_pull_count = 180
african_threshold = 10
six_threshold = 4
simulation_count = 50000
status_dict = {}
for i in range(simulation_count):
k = run_simulation(total_pull_count)
key = f"{k['african']}-{k['six star count']}"
if key in status_dict:
status_dict[key][0] += 1
else:
status_dict[key] = [0, k['african'], k['six star count']]
if k['african'] >= african_threshold and k['six star count'] <= six_threshold:
hit += 1
if k['african'] == african_threshold and k['six star count'] == six_threshold:
hit1 += 1
if k['african'] >= african_threshold:
hit2 += 1
print(hit / simulation_count * 1000, hit1 / simulation_count * 1000, hit2 / simulation_count * 1000)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
max_color = max([item[0] for item in status_dict.values()])
for key, item in status_dict.items():
color = np.array([1, 1 - item[0] / max_color, 0]) # 颜色 其中每个元素在0~1之间
ax.bar3d(item[1], item[2], 0, 1, 1, item[0], color=color)
ax.text(x=item[1], y=item[2], z=item[0] + 30, s=f"{item[1]}, {item[2]}, {item[0]}",
ha='center', fontsize=8, family='Calibri', va='center')
ax.set_xlabel('African ten pull')
ax.set_ylabel('Six star count')
ax.set_zlabel('Count')
ax.set_title('Pull Simulation Result')
plt.show()
print('done')