SHOW:
|
|
- or go back to the newest paste.
1 | import numpy as np | |
2 | import seaborn as sns | |
3 | import matplotlib.pyplot as plt | |
4 | ||
5 | np.random.seed(1234) | |
6 | ||
7 | # [02/07 18:30] Whisper from [Owner] Blah: gold can roll from 1375 to 2000, even % chance for every integer. A total | |
8 | # boost up to 200% is added to that roll consisting of the % sums of resistances, mob debuff and elemental distribution | |
9 | # [02/07 18:31] Whisper from [Owner] Blah: Resistances can roll from 5% to 40%, mob debuff from 5% to -15%, elemental | |
10 | # can roll from 5% to 30% (for elemental it is the distance away from 30% that is the boost) | |
11 | # [02/07 18:31] Whisper from [Owner] Blah: so ultimately 40% * 3 + 5% + 25% * 3 which should total to 200% | |
12 | ||
13 | # Theoretical max: 2000 * (1 + 0.4 + 0.4 + 0.4 + 0.05 + 0.25 + 0.25 + 0.25) = 6000 | |
14 | # Theoretical min: 1375 * (1 + 0.05 + 0.05 + 0.05 - 0.15 + 0.0 + 0.0 + 0.0) = 1375 | |
15 | ||
16 | num_simulations = 1_000_000 | |
17 | sim = [] | |
18 | ||
19 | for i in range(num_simulations): | |
20 | ||
21 | base_gold = np.random.randint(1375, 2000 + 1) | |
22 | water_res = np.random.randint(5, 41) / 100.0 | |
23 | fire_res = np.random.randint(5, 41) / 100.0 | |
24 | thunder_res = np.random.randint(5, 41) / 100.0 | |
25 | mob_debuff = np.random.randint(-15, 6) / 100.0 | |
26 | water_dis = 0.3 - np.random.randint(5, 31) / 100.0 | |
27 | fire_dis = 0.3 - np.random.randint(5, 31) / 100.0 | |
28 | thunder_dis = 0.3 - np.random.randint(5, 31) / 100.0 | |
29 | ||
30 | roll_gold = base_gold * (1 + water_res + fire_res + thunder_res + mob_debuff + water_dis + fire_dis + thunder_dis) | |
31 | sim.append(roll_gold) | |
32 | ||
33 | mu = np.mean(sim) | |
34 | std = np.std(sim) | |
35 | ||
36 | print(f'min: {np.min(sim)}') | |
37 | print(f'max: {np.max(sim)}') | |
38 | ||
39 | fake_data = np.random.normal(loc=mu, scale=std, size=num_simulations) | |
40 | ||
41 | fig, ax = plt.subplots(figsize=(9, 7), dpi=80) | |
42 | sns.histplot(sim, color=colors[0], kde=True, edgecolor=None, alpha=0.4, ax=ax, bins=50) | |
43 | plt.xlim(1375, 6000) | |
44 | plt.title('Catacomb base gold probability analysis', fontsize=14) | |
45 | plt.xlabel('Base gold', fontsize=12) | |
46 | plt.ylabel('Count', fontsize=12) | |
47 | ||
48 | plt.subplots_adjust(bottom=0.3) | |
49 | plt.gcf().text(0.66, 0.89, f'Theoretical min: {1375}', fontsize=12, family='monospace') | |
50 | plt.gcf().text(0.66, 0.86, f'Theoretical max: {6000}', fontsize=12, family='monospace') | |
51 | ||
52 | plt.gcf().text(0.66, 0.81, f'P(gold) > {np.percentile(sim, 50):.2f} = 50%', fontsize=12, family='monospace') | |
53 | plt.gcf().text(0.66, 0.78, f'P(gold) > {np.percentile(sim, 80):.2f} = 20%', fontsize=12, family='monospace') | |
54 | plt.gcf().text(0.66, 0.75, f'P(gold) > {np.percentile(sim, 90):.2f} = 10%', fontsize=12, family='monospace') | |
55 | plt.gcf().text(0.66, 0.72, f'P(gold) > {np.percentile(sim, 95):.2f} = 5%', fontsize=12, family='monospace') | |
56 | plt.gcf().text(0.66, 0.69, f'P(gold) > {np.percentile(sim, 97.5):.2f} = 2.5%', fontsize=12, family='monospace') | |
57 | plt.gcf().text(0.66, 0.66, f'P(gold) > {np.percentile(sim, 99):.2f} = 1%', fontsize=12, family='monospace') | |
58 | plt.gcf().text(0.66, 0.63, f'P(gold) > {np.percentile(sim, 99.9):.2f} = 0.1%', fontsize=12, family='monospace') | |
59 | plt.gcf().text(0.66, 0.60, f'P(gold) > {np.percentile(sim, 99.99):.2f} = 0.01%', fontsize=12, family='monospace') | |
60 | plt.gcf().text(0.66, 0.57, f'P(gold) > {np.percentile(sim, 99.999):.2f} = 0.001%', fontsize=12, family='monospace') | |
61 | ||
62 | plt.gcf().text(0.66, 0.52, f'P(gold) > 4000 = {(1-(np.array(sim) < 4000).astype(int).mean())*100:.3f}%', fontsize=12, family='monospace') | |
63 | plt.gcf().text(0.66, 0.49, f'P(gold) > 4250 = {(1-(np.array(sim) < 4250).astype(int).mean())*100:.3f}%', fontsize=12, family='monospace') | |
64 | plt.gcf().text(0.66, 0.46, f'P(gold) > 4500 = {(1-(np.array(sim) < 4500).astype(int).mean())*100:.3f}%', fontsize=12, family='monospace') | |
65 | plt.gcf().text(0.66, 0.43, f'P(gold) > 4750 = {(1-(np.array(sim) < 4750).astype(int).mean())*100:.3f}%', fontsize=12, family='monospace') | |
66 | plt.gcf().text(0.66, 0.40, f'P(gold) > 5000 = {(1-(np.array(sim) < 5000).astype(int).mean())*100:.3f}%', fontsize=12, family='monospace') | |
67 | plt.gcf().text(0.66, 0.37, f'P(gold) > 5250 = {(1-(np.array(sim) < 5250).astype(int).mean())*100:.3f}%', fontsize=12, family='monospace') | |
68 | ||
69 | plt.gcf().text(0.84, 0.02, 'Player data: anfneub', fontsize=8) | |
70 | ||
71 | plt.tight_layout() | |
72 | plt.savefig('cata_gold.png') | |
73 | ||
74 |