I'm converting many of my R programs to Python (a language I don't use on a day-to-day basis).
Here my program, which simulates a simple card game:
cards = ["Ace of Clubs",
"Ace of Diamonds",
"Ace of Hearts",
"Ace of Spades",
"2 of Clubs",
"2 of Diamonds",
"2 of Hearts",
"2 of Spades",
"3 of Clubs",
"3 of Diamonds",
"3 of Hearts",
"3 of Spades",
"4 of Clubs",
"4 of Diamonds",
"4 of Hearts",
"4 of Spades",
"5 of Clubs",
"5 of Diamonds",
"5 of Hearts",
"5 of Spades",
"6 of Clubs",
"6 of Diamonds",
"6 of Hearts",
"6 of Spades",
"7 of Clubs",
"7 of Diamonds",
"7 of Hearts",
"7 of Spades",
"8 of Clubs",
"8 of Diamonds",
"8 of Hearts",
"8 of Spades",
"9 of Clubs",
"9 of Diamonds",
"9 of Hearts",
"9 of Spades",
"10 of Clubs",
"10 of Diamonds",
"10 of Hearts",
"10 of Spades",
"Jack of Clubs",
"Jack of Diamonds",
"Jack of Hearts",
"Jack of Spades",
"King of Clubs",
"King of Diamonds",
"King of Hearts",
"King of Spades",
"Queen of Clubs",
"Queen of Diamonds",
"Queen of Hearts",
"Queen of Spades"]
ticket_price = 5 # price per ticket
max_num_tickets = np.random.randint(1, 1000, 1) # maximum number of tickets sold
week = 0 # initialize counter
payoff = 0 # initialize weekly winnings
jackpot = 0 # initialize progressive jackpot
while(week < 52):
week = 1 # increment counter
tickets = np.random.randint(max_num_tickets 1, size = 1) # random number of tickets sold
fill_envelopes = np.random.choice(cards, size = len(cards), replace = False) # assign cards to envelopes
pick_ticket = np.random.randint(tickets 1, size = 1) # select random ticket
pick_envelope = np.random.choice(fill_envelopes, size = 1) # choose random envelope
cards = cards[not cards in pick_envelope] # remove selected card
payoff = tickets * ticket_price # ticket sales
jackpot = jackpot (0.30 * payoff) # update weekly winnings; 30% of ticket sales goes into jackpot
print("\n Week: ", week,
"\n Ticket number: ", pick_ticket,
"\n Card selected: ", pick_envelope)
if ("Ace of Spades" in pick_envelope):
print("\n Outcome: Congratulations, you've selected the Ace of Spades! You've won the progressive jackpot! \n Jackpot: $",jackpot, "\n \n")
break
else:
print("\n Outcome: Sorry, you didn't select the Ace of Spades! Better luck next time! \n Payoff: $",(0.20 * payoff)) # 20% of ticket sales goes to winning ticket holder each week
print("\n Proceeds donated to charity: $",(0.50 * payoff), "\n \n") # 50% of all ticket sales goes to charity
cards = cards # reset deck
Appearently the bug is in the fill_envelopes
line.
Here's the error returned by the interpreter:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
mtrand.pyx in numpy.random.mtrand.RandomState.choice()
TypeError: 'str' object cannot be interpreted as an integer
During handling of the above exception, another exception occurred:
ValueError Traceback (most recent call last)
<ipython-input-79-65a112fc8498> in <module>()
62 week = 1 # increment counter
63 tickets = np.random.randint(max_num_tickets 1, size = 1) # random number of tickets sold
---> 64 fill_envelopes = np.random.choice(cards, size = len(cards), replace = False) # assign cards to envelopes
65 pick_ticket = np.random.randint(tickets 1, size = 1) # select random ticket
66 pick_envelope = np.random.choice(fill_envelopes, size = 1) # choose random envelope
mtrand.pyx in numpy.random.mtrand.RandomState.choice()
ValueError: a must be 1-dimensional or an integer
It seems that the interpreter is trying to treat a string object as an integer. This was found while also encountering a TypeError
.
Debugging using print statements line-by-line reveals things are working as expected. Thus, i'm a bit lost as to what's going on here.
CodePudding user response:
The error is this for the library numpy:
You can look it up https://numpy.org/doc/stable/reference/random/generated/numpy.random.choice.html I
CodePudding user response:
Two quick things: You might have just copy/pasted wrong, but you have a break outside of a loop. If you want that if/else
to be in the loop, make sure it is indented correctly. The other thing, which is your actual problem: you are reusing a variable you want to remain static.
Running your code the first time works just fine, but second time breaks. Why? It has to do with this line cards = cards[not cards in pick_envelope]
. Here, you replace the cards
list with a single card, and then never re-make it into the original list of all 52 cards. I suspect this is actually a typo and you meant for that variable to be the singular card
. If this is NOT a typo, you need to re-define the cards list to be the list of 52 cards at the start of the loop. Otherwise, the second time around the loop will have cards = 'someString'
, and you will get the ValueError
.
EDIT: For further clarification – you are getting this error on the second go around the while loop, because you change your cards
list to a string that has only one card, which happens to be the card that was 'chosen' in the previous iteration. You need to either make sure you don't change the original cards
list, or re-define it at the start of the loop.