init
This commit is contained in:
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user