#python #loops #random
#python #циклы #Случайный
Вопрос:
Я новичок в Python. Я пытаюсь написать небольшую игру, которая просит конечного пользователя выбрать число от 1 до 1000 и сохранить его в голове (число не предоставляется программе). Программа должна быть в состоянии найти число в пределах 10 догадок. Как я обычно делаю, я пошел по неверному пути. Моя программа работает большую часть времени, но бывают случаи, когда она не находит число менее чем за 10 догадок. Вот мой код:
# script to guess a user's number between 1 and 1000 within 10 guesses
# import random so we can use it to generate random numbers
from random import randint
# Variables
lowerBound = 1
upperBound = 1000
numGuesses = 1
myGuess = 500
failed = False
# Welcome Message
print("#####################################################################################################"
"n# #"
"n# Please think of a number between 1 and 1000. I will attempt to guess the number in 10 tries. #"
"n# #"
"n#####################################################################################################")
while numGuesses <= 10:
# if the lower and upper bounds match we've found the number
if lowerBound == upperBound:
print(f"nYour number is {str(lowerBound)}. It took me '{str(numGuesses)} guesses!")
break
print(f"nIs the number {str(myGuess)}? If correct, type CORRECT. If low, type LOW. If high, type HIGH.")
# uncomment for var output
# print(f"nGuesses = {str(numGuesses)}nLower bound = {str(lowerBound)}nUpper bound = {str(upperBound)}")
userFeedback = input("nResponse: ").upper()
if userFeedback == 'HIGH':
print(f"nGuess #{str(numGuesses)} was too high")
if numGuesses == 10:
failed = True
break
upperBound = myGuess - 1
myGuess = randint(lowerBound, upperBound)
elif userFeedback == 'LOW':
print(f"nGuess #{str(numGuesses)} was too low")
if numGuesses == 10:
failed = True
break
lowerBound = myGuess 1
myGuess = randint(lowerBound, upperBound)
elif userFeedback == 'CORRECT':
print(f"nYour number is {str(myGuess)}! It took me {str(numGuesses)} guesses!")
break
numGuesses = 1
if failed:
print(f"nMy final guess of {str(myGuess)} was not correct. I wasn't able to guess your number in 10 tries.")
Кажется очевидным (сейчас), что способ, которым я сокращаю числа, не сработает. Первоначально я думал спросить, было ли это 500, а если меньше, спросить, было ли это 250. Если снова понизить, спросите, было ли это 125, и так далее. Если выше, спросите, было ли это 750, 875 и так далее. Это правильный подход здесь?
Я слишком долго думал об этом, и я считаю, что я приготовил свой мозг. Спасибо!
Комментарии:
1. Не используйте случайное число для следующего предположения. Используйте
(upperBound - lowerBound) / 2
.2. не используйте random!!! это ставит все на волю случая
3. ваш первоначальный план был правильным. почему вместо этого вы использовали случайное число?
4. @PeterM. Если бы только у меня был ответ на это. 🙂 Я попробую преобразовать его. У кого-нибудь есть пример такого подхода?
5. myGuess = int((Верхняя граница-нижняя граница) / 2)
Ответ №1:
myGuess = int(math.ceil((myGuess) / 2))
неверно.
Если вы сузили диапазон до между 6
и 8
и вы предполагали 7
, ваш предыдущий код будет вызывать 4
вместо этого, который находится за пределами вашего диапазона поиска.
if userFeedback == 'HIGH':
print(f"nGuess #{numGuesses} was too high")
upperBound = myGuess - 1
elif userFeedback == 'LOW':
print(f"nGuess #{numGuesses} was too low")
lowerBound = myGuess 1
myGuess = int(lowerBound ((upperBound - lowerBound) / 2))
Ответ №2:
Я обновил свой код, и я думаю, что он у меня есть. Спасибо за советы.
# script to guess a number between 1 and 1000 within 10 guesses
# Variables
lowerBound = 1
upperBound = 1000
numGuesses = 1
myGuess = 500
# Welcome Message
print("#####################################################################################################"
"n# #"
"n# Please think of a number between 1 and 1000. I will attempt to guess the number in 10 tries. #"
"n# #"
"n#####################################################################################################")
while numGuesses <= 10:
# uncomment next line for var output
# print(f"nGuesses = {numGuesses}nLower bound = {lowerBound}nUpper bound = {upperBound}")
print(f"nIs the number {myGuess}? If correct, type CORRECT. If low, type LOW. If high, type HIGH.")
userFeedback = input("nResponse: ").upper()
if userFeedback == 'HIGH':
print(f"nGuess #{numGuesses} was too high")
upperBound = myGuess
myGuess = (lowerBound myGuess) // 2
elif userFeedback == 'LOW':
print(f"nGuess #{numGuesses} was too low")
lowerBound = myGuess
myGuess = (upperBound myGuess 1) // 2
elif userFeedback == 'CORRECT':
print(f"nYour number is {myGuess}! It took me {numGuesses} guesses!")
break
numGuesses = 1