# How Voting Systems Work 10, Exercise 2: how often does a method elect someone a quarter of the club ranks last? # Assumed model: polarised electorates of 25 voters and 5 candidates, 2000 elections, seed 5. # Needs votelab.py in the same folder. import random from votelab import make_electorate, make_ballots, METHODS rng = random.Random(5) runs = 2000 bad = {m: 0 for m in METHODS} for _ in range(runs): voters, cands = make_electorate(rng, "polarised") b = make_ballots(voters, cands) for name, method in METHODS.items(): w = method(b) last = sum(1 for r in b["rank"] if r[-1] == w) if last * 4 >= len(b["rank"]): # at least a quarter of the voters rank the winner last bad[name] += 1 for name in METHODS: print(f"{name:>9}: winner ranked last by 25% or more in {bad[name]:>3} of {runs} elections ({bad[name] / runs:.1%})") # Output from a real run: # plurality: winner ranked last by 25% or more in 381 of 2000 elections (19.1%) # irv: winner ranked last by 25% or more in 210 of 2000 elections (10.5%) # borda: winner ranked last by 25% or more in 12 of 2000 elections (0.6%) # copeland: winner ranked last by 25% or more in 114 of 2000 elections (5.7%) # approval: winner ranked last by 25% or more in 39 of 2000 elections (1.9%) # score: winner ranked last by 25% or more in 40 of 2000 elections (2.0%)