изучаю python — не смог разобраться в random.randint

#python-3.x

#python-3.x

Вопрос:

Я изучаю python atm и выполнял упражнение с этого сайта

Попросите пользователя выбрать произвольное число от 1 до 100 и продолжить угадывать его правильно в течение семи попыток. После каждого предположения пользователь должен указать, является ли его число больше, меньше или равно вашему предположению.

код, который я написал, но не соответствовал решению, был таким—

 import random
pick = int(input('number? '))
count = 0

while count <= 7:
    number = random.randint(1, 10)
    count  = 1
    print('is the number ', number, '?')

if number <= pick:
    print('press enter if higher')
    higher = input()
elif number >= pick:
    print('press enter if lower')
    lower = input()
elif number == pick:
    print('good?')
    yes = input()
    break

print('end')
  

Я не смог правильно разобраться с этим. Когда number ==pick, цикл не завершился. Было ли это из-за random.randint, который искажал значение elif number ==pick ?

Решение, приведенное на сайте, сильно отличалось от того, которое я написал. Как я мог бы сделать это лучше?

Спасибо!

Комментарии:

1. Отступ в вашем коде, похоже, нарушен. Пожалуйста, сверьтесь с вашим исходным кодом.

Ответ №1:

Что ж, вот небольшая правка, которую я сделал только на основе опубликованного вами текста проблемы:

 import random
input("Think of a number from 1 to 10, then press enter.  Don't tell me, I'll guess it.")
low = 1
high = 10
done = False

for guesses in range(7):
    number = random.randint(low, high)
    print("I'm guessing", number)
    happy = False
    while not happy:
        resp = input('Enter H if your number is higher, L if lower or E for equal: ')[0].upper()
        if resp == 'E':
            if guesses:
                plural = 'es'
            else:
                plural = ''
            print('Yay!  I got it in {} guess{}.'.format(guesses 1, plural))
            happy = True
            done = True
            break
        elif resp == 'H':
            happy = True
            low = number   1
        elif resp == 'L':
            happy = True
            high = number -1
        else:
            print("That wasn't a valid response.")
    if done:
        break

print('end')
  

Что я сделал по-другому:

  • Программа не получает ваш номер в качестве входных данных (в конце концов, она пытается его угадать).
  • Я установил low amp; high в начальный диапазон и установил флаг done, поскольку мне нужно будет выйти из двух уровней цикла при успешном выполнении
  • далее, я думаю, на основе диапазона low-high.
  • попросите H, L или E указать, где находится мое предположение
  • измените диапазон на основе того, что говорит мне пользователь

Основное отличие заключается в том, что этот код несколько разумно угадывает число. (Хотя с 7 предположениями это все равно может завершиться неудачей.) Более интеллектуальным алгоритмом было бы угадывать средние точки каждый раз, а не случайным образом.

Комментарии:

1. уточните -строки с 14 по 17 (‘если догадывается:’); что они делают? Спасибо!

2. Хех, извини, что это касается моей любимой мозоли. Программы, которые подвергаются множественным испытаниям… Что он делает, так это то, что если предположения не равны нулю (что происходит во всех случаях, кроме первого раза в цикле), он присваивает ‘es’ множественному числу строки, поэтому вывод ‘Yay! Я понял это в 3 догадках.’ в то время как при первом прохождении цикла он выводил «Ура! Я понял это с первого раза.’

Ответ №2:

Ошибка здесь заключается в вашем использовании <= и >= . Они означают less-than-or-equal-to и greater-than-or-equal-to соответственно. Следовательно, ваш код никогда не достигнет elif number == pick: строки, потому что одно из первых двух утверждений всегда будет истинным. Ясно видеть, что если number == pick то первое утверждение будет истинным, и программа предложит пользователю press enter if higher .

Ответ? Измените <= на simply < и аналогично позвольте >= стать > . Таким образом, тест предназначен только для less-than и greater-than .