Skip to content

Instantly share code, notes, and snippets.

@rbranson
Created August 16, 2021 22:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rbranson/e2992a2671bb140fc6909dcbded4fa4b to your computer and use it in GitHub Desktop.
Save rbranson/e2992a2671bb140fc6909dcbded4fa4b to your computer and use it in GitHub Desktop.
import random
arr_values = [0, 60000000, 120000000, 240000000, 480000000]
arr_prob = [0.0625, 0.5, 0.25, 0.125, 0.0625]
arr_mult_values = [25, 50, 100]
arr_mult_prob = [0.70, 0.20, 0.10]
def probs_index(probs, v):
t = 0.0
for i, p in enumerate(probs):
t += p
if v <= t:
return i
raise "panic"
def choose_from_values(vals, probs):
r = random.uniform(0, 1)
i = probs_index(probs, r)
return vals[i]
def f_cfv(vals, probs):
return lambda: choose_from_values(vals, probs)
def sim(fns, nsamples=10000):
samples = []
for i in range(nsamples):
vec = tuple(fn() for fn in fns)
samples.append(vec)
return samples
def md_freqs_from_sim(val_sets, samples):
val_freqs = {}
for s in samples:
if s not in val_freqs:
val_freqs[s] = 0
val_freqs[s] += 1
return val_freqs
def probs_for_md_freqs(md_freqs, n):
return {k: v/n for k, v in md_freqs.items()}
sim_fns=[
f_cfv(arr_values, arr_prob),
f_cfv(arr_mult_values, arr_mult_prob),
]
simout=sim(sim_fns)
md_freqs=md_freqs_from_sim([arr_values, arr_mult_values], simout)
output=probs_for_md_freqs(md_freqs, len(simout))
for k in sorted(output):
v=output[k]
x=','.join([str(x) for x in k])
print("{},{}".format(x, v))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment