#coinflips2.py import random flips = int(input("Input the number of flips to do: ")) display_flips = input("Do you want to display the flips? (y or n) ") heads = tails = 0 heads_ahead = tails_ahead = 0 is_head_run = is_tail_run = True #counterintuitive head_run = tail_run = 0 head_runs = [] tail_runs = [] max_head_run = max_tail_run = 0 max_head_run_start = max_tail_run_start = -1 max_heads_ahead = max_tails_ahead = 0 max_heads_ahead_place = max_tails_ahead_place = -1 side_changes = 0 lead_changes = 0 for flipNum in range(flips): if random.choice(['H','T']) == 'H': #randomly H or T if display_flips == 'y': print('H',end="") heads += 1 head_run += 1 if is_tail_run: #tail run ends side_changes += 1 is_head_run = True is_tail_run = False if tail_run > max_tail_run: max_tail_run = tail_run max_tail_run_start = (heads+tails) - tail_run if tails > 0: #bypass first at start tail_runs.append(tail_run) tail_run = 0 if (heads-tails) > max_heads_ahead: max_heads_ahead = heads-tails max_heads_ahead_place = heads+tails if heads == tails + 1: #this H moves Heads into the lead lead_changes += 1 else: if display_flips == 'y': print('T',end="") tails += 1 tail_run += 1 if is_head_run: side_changes += 1 is_tail_run = True is_head_run = False if head_run > max_head_run: max_head_run = head_run max_head_run_start = (heads+tails) - head_run if heads > 0: #bypass first at start head_runs.append(head_run) head_run = 0 if (tails-heads) > max_tails_ahead: max_tails_ahead = tails-heads max_tails_ahead_place = heads+tails if tails== heads + 1: #this T moves Tails into the lead lead_changes += 1 #if last run is the max if is_tail_run: if tail_run > max_tail_run: max_tail_run = tail_run max_tail_run_start = (heads+tails) - tail_run + 1 tail_runs.append(tail_run) else: if head_run > max_head_run: max_head_run = head_run max_head_run_start = (heads+tails) - head_run + 1 head_runs.append(head_run) print() print("Number of heads:", heads, " %", (heads/flips*100),\ " Number of tails:", tails, " %", (tails/flips*100)) print("Changes of sides:", side_changes) print("Changes of lead:", lead_changes) print("Head runs:",head_runs) #comment out if doing many flips print("Longest run of heads:",max_head_run,"starting at flip #",max_head_run_start) print(" Average run of heads:",sum(head_runs)/len(head_runs)) print("Tail runs:",tail_runs) print("Longest run of tails:",max_tail_run,"starting at flip #",max_tail_run_start) print(" Average run of tails:",sum(tail_runs)/len(tail_runs)) if max_heads_ahead > 0: print("Max heads ahead gap:",max_heads_ahead,"at flip #",max_heads_ahead_place) else: print("Heads never ahead") if max_tails_ahead > 0: print("Max tails ahead gap:",max_tails_ahead,"at flip #",max_tails_ahead_place) else: print("Tails never ahead") # average run is about 2 # 1, 2, 3, 4, ...each runlength is about half as frequent as the previous length # about half being length 1. Thus, #side changes is about half the flips.