[SOLVED] Python coin flip with functions

Issue

I need to create a python program that will use various functions to simulate flipping a coin 100 times and finding the largest streak of "H"’s out of 10,000 tries. I am stuck on how to finish the def main() function, specifically the counter. I also don’t know if my program is calculating the streaks correctly.

def flipCoin() – returns ‘H’ or ‘T’ with the same probability as a coin.

def simulate(numFlips) – simulates flipping a coin numFlips(100) times. This function returns a list of length numFlips containing H’s and T’s.

def countStreak(flips_list) – iterates through the flips list passed to it and counts streaks of ‘H’s and returns the largest streak it finds. Keep track of the current number of heads and the current largest streak of heads in two separate variables.
As you iterate through the list, keep track of the current number of heads you’ve seen in a row. If you see a tail, check if the current streak of heads is larger than your current longest streak. If so, save the current streak. Then reset your heads counter.

In the main function, write a testing loop that simulates the process 10000 times.
Keep track of the current largest streak of heads and display this result after the test loop completes.

# import statements                                                             
import random

# function defintions                                                           
def flip():
    coin = random.randint(0, 1)
    if coin == 0:
        return "H"
    else:
        return "T"

def simulate(num_flips):
# simulates numFlips coin flips                                             
# returns a list of the flips
    numFlips = []
    for i in range(100):
        numFlips.append(flip())
    return numFlips

def countStreak(flips_list):
# iterates through the 'flips' list                                         
# returns number of 'H's
    count = 0
    maxCount = 0
    flips_list = simulate()
    for i in flips_list:
        if i == "H":
            count += 1
            if count > maxCount:
                maxCount = count
        else:
            count = 0
    return maxCount

def main():
    for j in range(10000):
        trial = simulate(100)
        coinFlip = countStreak(1)
        # need something here to track count of streaks for "H"
    print("The longest streak of heads was " + str(coinFlip) +".")


if __name__ == "__main__":
    main()

Solution

So there was a flaw in your code, you were running simulate() function 10000 times. But actually, you had to run it once, but return a list of 10000 items. Also, you need not check the streak every time so the check_streak() need to be out of the loop and we need to pass the result obtained from simulate(10000) into it.
Correct Code:

# import statements                                                             
import random

# function defintions                                                           
def flip():
    coin = random.randint(0, 1) # better option would be to use random.choice()
    if coin == 0:
        return "H"
    else:
        return "T"

def simulate(num):
# simulates numFlips coin flips                                             
# returns a list of the flips
    numFlips = []
    for i in range(num): # this needs to run num times
        numFlips.append(flip())
    return numFlips

def countStreak(flips_list):
# iterates through the 'flips' list                                         
# returns number of 'H's
    count = 0
    maxCount = 0
    for i in flips_list:
        if i == "H":
            count += 1
            if count > maxCount:
                maxCount = count
        else:
            count = 0
    return maxCount

def main():
    trial = []
    for j in range(10000):
        temp2 = simulate(100) # SImulate 10000 coin flips
        coinFlip = countStreak(temp2) # Check streak of variable trial
        trial.append(coinFlip)
        # need something here to track count of streaks for "H"
    # print(trial)
    print("The longest streak of heads was " + str(max(trial)) +".")

if __name__ == "__main__":
    main()

This Part is Optional, For optimisation

Though the logic isn’t wrong, you need not make the list 1st and then check streak, you can simply check it together, it will take less time and space.
Also, your logic is correct, but this one would be better:

import random

# function defintions                                                           
def flip():
    return random.choice(['H', 'T']) # using random.choice()

def simulate(num_flips):
    streak = 0
    temp = 0    
    for i in range(num_flips):
        if flip() == 'H':
            temp+=1 # adding one to temporary streak if it is a heads
        else: # this block executes if streak is broken
            if temp > streak:
                streak = temp
            temp = 0
    return streak

def main():
    trial = []
    for i in range(10000):
        trial.append(simulate(100))
    print("The longest streak of heads was " + str(max(trial)) +".")


if __name__ == "__main__":
    main()

Answered By – Anshumaan Mishra

Answer Checked By – Katrina (BugsFixing Volunteer)

Leave a Reply

Your email address will not be published.