#!/usr/bin/env python import numpy as np import random registered_events = {} # We'll define events as predicates: # Also I'll use some decorators, just to show off # the decorator: def event(event_pred): key = event_pred.__name__ val = (event_pred, 0) registered_events[key] = val return event_pred @event def omega(value): return True @event def a1(value): return value % 2 == 0 @event def b1(value): return value <= 4 @event def ab1(value): return a1(value) and b1(value) @event def a2(value): return value % 2 == 0 @event def b2(value): return value <= 5 @event def ab2(value): return a2(value) and b2(value) random.seed() def dice_experiment(reps): for i in range(reps): r = random.randint(1,6) for key, value in registered_events.items(): func, count = value if func(r): count += 1 newval = (func, count) registered_events[key] = newval dice_experiment(1000) total = registered_events["omega"][1] print(f"Total = ", registered_events["omega"][1]/total) print(f"P^(A1) = ", registered_events["a1"][1]/total) print(f"P^(B1) = ", registered_events["b1"][1]/total) print(f"P^(A1)P^(B1) = ", registered_events["a1"][1]/total * registered_events["b1"][1]/total) print(f"P^(AB1) = ", registered_events["ab1"][1]/total) print(f"P^(A2) = ", registered_events["a2"][1]/total) print(f"P^(B2) = ", registered_events["b2"][1]/total) print(f"P^(A2)P^(B2) = ", registered_events["a2"][1]/total * registered_events["b2"][1]/total) print(f"P^(AB2) = ", registered_events["ab2"][1]/total) """Example output: Total = 1.0 P^(A1) = 0.494 P^(B1) = 0.667 P^(A1)P^(B1) = 0.329498 P^(AB1) = 0.329 P^(A2) = 0.494 P^(B2) = 0.835 P^(A2)P^(B2) = 0.41249 P^(AB2) = 0.329"""