Exercise 2 solution import random def run(rng, p, size, max_gens=2000): for gen in range(1, max_gens + 1): k = sum(rng.random() < p for _ in range(2 * size)) p = k / (2 * size) if p in (0, 1): return p, gen return p, max_gens rng = random.Random(2) reps = 400 results = [run(rng, 0.2, 25) for _ in range(reps)] fixed = sum(1 for p, g in results if p == 1) lost = sum(1 for p, g in results if p == 0) mean_gens = sum(g for p, g in results) / reps print(fixed, lost, fixed / reps, round(mean_gens, 1)) Output: 75 325 0.1875 50.5 Reading it: the allele was fixed in 75 of 400 runs (0.1875) and lost in 325. The fixed fraction is close to the starting frequency of 0.2: in this simple model, the chance that an allele eventually takes over equals its starting frequency (check). The average time to reach either end was about 50 generations.