Python indentation - simple error - python

So brand new to python, and I've come across something I can't explain, much less put in to words to find a possible answer for. I've made a little coin flipping program:
import random
print("I will flip a coin 1000 times")
input()
flips = 0
heads = 0
while flips < 1000:
if random.randint(0, 1) == 1:
heads = heads + 1
flips = flips + 1
print()
print("Out of 1000 coin tosses, heads came up " + str(heads) + " times!")
This version of the program does not work, it tells me after 1000 flips, there have been 1000 heads every time.
import random
print("I will flip a coin 1000 times")
input()
flips = 0
heads = 0
while flips < 1000:
if random.randint(0, 1) == 1:
heads = heads + 1
flips = flips + 1
print()
print("Out of 1000 coin tosses, heads came up " + str(heads) + " times!")
This version of the program works perfectly however, notice I have changed the indentation of "flips" in the while loop.
Can anyone tell me why this is? Thanks in advance!

Python language is indentation dependent. Unlike most C-based languages, it uses indentation to delimit blocks.
So your two scripts have a different semantic:
if random.randint(0, 1) == 1:
heads = heads + 1
flips = flips + 1
...will increment both variables if the condition is True.
if random.randint(0, 1) == 1:
heads = heads + 1
flips = flips + 1
...will increment heads only if the condition is True, and will always increment flips

That's because if that "flips" line is in the if, then it will only execute if it is heads. Therefore, your coin flip count only increments when it's a head, and so by the time flips reached 1000, it means you've executed the if 1000 times and got 1000 heads.
(When you get a tail, flips won't increment and the loop keeps going and nothing happens)

Related

What is a logical condition for a while loop stops only when both are >= 100?

Here are the instructions:
The following program is meant to simulate a sequence of coin flips. The goal of the program is to simulate enough coin flips until there have been at least 100 heads and 100 tails. However, there are errors in the program on exactly 3 lines of the code. Fix those 3 lines (and only those 3 lines) so that the program behaves as it should.
Here is my code so far:
import random
heads_count = 0
tails_count = 0
flips = []
while heads_count < 100 and tails_count < 100:
flip = random.choice(['heads', 'tails'])
flips.append(flip)
if flip == 'heads':
heads_count += 1
else:
tails_count += 1
print('heads:', heads_count)
print('tails:', tails_count)
print(flips)
I found 2 of the errors and I know the last one is in my while loop line, but I can't figure out what's wrong with this line? Anyone know of a logical condition for a while loop stops only when both are >= 100?
As written, the while loop breaks when either heads or tails reaches a total of 100. If heads_count = 100, but tails_count = 90, then the statement:
heads_count < 100 and tails_count < 100
will evaluate to false, even though tails_count hasn't hit 100 yet. There are other solutions, like creating a "done" variable which is set equal to True and at the end of each iteration you check to see if both counts are >= 100, but if you need one line of code you should use an OR statement, like:
while heads_count < 100 OR tails_count < 100:
This evaluates to True until both of them are >= 100, when it will evaluate to False, and break the loop.

My Python Counter code is inconsistent, can someone fix it?

I'm a Beginner; I'm trying to make a program in python 3.5 that flips a coin 100 times, then counts the amount of heads and tails from those 100 flips and displays it at the bottom. I got the 100 flips to work, and I also tried to make a counter to count the amount of h/t that landed, but it's inconsistent and wonky, and the counters doesn't count the correct amount. I would love it if some one could help me.
import random
hcounter = 0
tcounter = 0
while True:
flip = ['heads','tails']
decision = input("Flip a coin 100 times? (y/n): ")
if decision == 'y':
#for some reason, the range doubles the number; I dont know why, so since I want 100 flips, I put 50 for the range.
for x in range(0, 50):
for y in flip:
print(random.choice(flip))
if random.choice(flip) == flip[0]:
hcounter += 1
elif random.choice(flip) == flip[1]:
tcounter += 1
print("--------------------------------")
print("Heads: ",hcounter,"\nTails: ",tcounter)
elif decision == 'n':
print("\nOk")
break
yeah
This is a really good start to coding! A few things to fix, let's go through 'em.
if random.choice(flip) == flip[0]:
hcounter += 1
elif random.choice(flip) == flip[1]:
tcounter += 1
This isn't correct. If it isn't a head, it is a tail, but you call random.choice(flip) again, asking Python if it is now a tail. If it goes tails then heads, we don't add anything.
for x in range(0, 50):
for y in flip:
The first line will make the program run 50 times. But then in each of those 50 loops, the for y will make it run 2 times, once with y as heads and once for y as tails. We don't need this at all.
Apart from that, good job!
import random
hcounter = 0
tcounter = 0
while True:
flip = ['heads','tails']
decision = input("Flip a coin 100 times? (y/n): ")
if decision == 'y':
for x in range(0, 50):
if random.choice(flip) == flip[0]:
print("Heads!")
hcounter += 1
else:
print("Heads!")
tcounter += 1
print("--------------------------------")
print("Heads: ",hcounter,"\nTails: ",tcounter)
elif decision == 'n':
print("\nOk")
break
The doubling comes from this:
for x in range(0, 50): # 50 loops
for y in flip: # each with two more operations
An easier way to do this would be something like
flip = ['heads', 'tails']
results = [ random.choice(flip) for i in range(100)]
head_counter = results.count(flip[0])
tail_counter = results.count(flip[1])
If you want to practice incremental counting:
flip = ['heads', 'tails']
results = []
heads, tails = 0, 0
for _ in range(100):
results.append(random.choice(flip))
if results[-1] == flip[0]:
heads += 1
else:
tails += 1
enter code here
You can also do that without a for-loop:
k = 100 # times
hcounter = sum(random.choices([0,1],k=k)) # or tails if you want :)
print("Heads: ", hcounter,"\nTails: ", k - hcounter )
Your code is great... except for one part. There is a unnecessary line of code in there. You mentioned doubling correct? Well that's were it comes from. I suggest take of the line of code:
for y in flip:
You see what this is doing is incrementing through you heads and tails list and size the len of that list is two it doubles. If it was three it would triple. So if you take it off it should only do it once. You code would look like this. Tell me if it works:
import random
hcounter = 0
tcounter = 0
while True:
flip = ['heads','tails']
decision = input("Flip a coin 100 times? (y/n): ")
if decision == 'y':
#for some reason, the range doubles the number; I dont know why, so since I want 100 flips, I put 50 for the range.
for x in range(0, 50):
print(random.choice(flip))
if random.choice(flip) == flip[0]:
hcounter += 1
elif random.choice(flip) == flip[1]:
tcounter += 1
print("--------------------------------")
print("Heads: ",hcounter,"\nTails: ",tcounter)
elif decision == 'n':
print("\nOk")
break

Counting Heads and Tails in a coin flip program

For my assignment, I have to use Functions within Python to simulate a coin flip. I managed to get the coin flip to showcase heads and tales for the amount the user has inputted. However, for the next portion, I have to get the program to read how many times Heads and Tails appeared. The error I am getting is
'NameError: name 'heads' is not defined'.
import random
def main():
tosses = int(input("Please enter the amount of coin tosses:"))
coin(tosses)
count = 0
heads = 0
tails = 0
def coin(tosses):
for toss in range(tosses):
if random.randint(1, 2) == 1:
print('Heads')
heads += 1
count += 1
else:
print('Tails')
heads += 1
count += 1
print (heads)
print (tails)
main()
Problem
heads was defined out of the scope of the function coin.
Solution
Try defining the variables inside the function, then returning them. Note: the same had to be done with main.
import random
def main():
tosses = int(input("Please enter the amount of coin tosses:"))
coin(tosses)
heads, tails, count = coin(tosses)
return heads, tails
def coin(tosses):
count = 0
heads = 0
tails = 0
for toss in range(tosses):
if random.randint(1, 2) == 1:
print('Heads')
heads += 1
count += 1
else:
print('Tails')
tails += 1 # note you had this say heads before
count += 1
return heads, tails, count
heads, tails = main()
print(heads)
print(tails)
More on why this problem occurred
When you use def and create a new function, all of the variables in that function are accessible just to that function.
What was happening to you, is that you were trying to update the heads variable with heads += 1, but the function literally didn't know what the variable you were referring to is! (That variable was defined in main, and is only accessible from within the main function.)

Python - while loop count

I need to know the score of "heads" and "tails" in 5 times tossing the coin.
For example, the result should be:
- Heads was 3 times
- Tails was 2 times
import random
print("Heads or tails. Let's toss a coin five times.\n")
toss = 1
while toss <= 5:
coin = ["HEADS", "TAILS"]
y = random.choice(coin)
print("Toss number:", toss, "is showing:", y)
toss = toss + 1
I have made changes to your code to count the frequency of each coin side (Heads or Tails),
import random
print("Heads or tails. Let's toss a coin five times.\n")
toss = 1
counts = {"HEADS": 0, "TAILS": 0}
while toss <= 5:
coin = ["HEADS", "TAILS"]
y = random.choice(coin)
counts[y] += 1
print("Toss number:", toss, "is showing:", y)
toss = toss + 1
print("Heads was " + str(counts["HEADS"]) + " times - Tails was " + str(counts["TAILS"]) + " times")
You should have two variables, head and tail:
import random
print("Heads or tails. Let's toss a coin five times.\n")
head = tail = 0
for i in range(5):
coin = ["HEADS", "TAILS"]
y = random.choice(coin)
print("Toss number:", i, "is showing:", y)
if y == "HEADS":
head += 1
elif y == "TAILS":
tail += 1
Or, a better solution would be having a dictionary with keys representing heads and tails, with the value representing the count.
One simple solution would be to let toss be a list of coin toss results. Starting with an empty list, you could loop until the list contained 5 results and on each toss push a new member into the list. That way you end up with a single data structure that contains all the information you need about the tosses.
Create two variables, initialize them to 0, check the result of the coin toss in a if block and add accordingly.
heads, tails = 0, 0
if y == "HEADS":
heads += 1
else:
tails += 1
return (heads, tails)

Heads or Tails / Coin-flip program

I want to write a coin flip or "Heads or Tails" program, but when I run it, it only gets either heads or tails everytime. I can't see why, it's a logical error so I find it hard to spot.
import random
flips = 1
coin = random.randint(1,2)
heads = 0
tails= 0
while flips <= 100:
if coin == 1:
print("Heads")
heads += 1
flips +=1
elif coin == 2:
print("tails")
tails += 1
flips +=1
print("You got", heads, "heads and", tails,"tails!")
input("Exit")
Python removes a lot of code writing that you have to do in other languages. This program is only three lines. Using the random() method, you're able to do this in a very simple matter.
Here is my code.
import random
coin_flip = ['heads','tails']
print random.choice(coin_flip)
import random
flips = 0
heads = 0
tails = 0
while flips < 100:
if random.randint(1,2) == 1:
print("heads")
heads += 1
else:
print("tails")
tails += 1
flips += 1
print("you got ", heads," heads, and ", tails," tails!")
input ("exit")
Changes made: starts from 0 and is only raising count when a flip has been made (also, flip is made every iteration as the cases are contained enough)
also, im not casting the toss to a seperate variable but comparing it immediately.
my output was:
you got 54 heads, and 46 tails!
exit
without listing the seperate flips
Note; this was the first time I ever wrote python. If there's room for optimalisation, let me know!
Try this:
import random
flips = 1
heads = 0
tails= 0
while flips <= 100:
coin = random.randint(1,2)
flips +=1
if coin == 1:
print("Heads")
heads += 1
elif coin == 2:
print("tails")
tails += 1
print("You got " + str(heads) + " heads and " + str(tails) + " tails!")
raw_input("Exit")
Edits i made:
put coins variable in loop so that a new random value is assigned on every call.

Categories