Python 猜测数字的最快方法是只知道它是高于还是低于之前的猜测?

Python 猜测数字的最快方法是只知道它是高于还是低于之前的猜测?,python,Python,我试图解决一个问题,我必须猜测一个介于1和2*10^9之间的数字,只知道它是高于还是低于我之前的猜测 现在我有一个适用于所有情况的代码,但它超出了猜测限制,即仅31 status = "" high = 2000000000 low = 1 num = low print num while 1: status= raw_input() if status== "OK": break elif status == "Higher": low

我试图解决一个问题,我必须猜测一个介于1和2*10^9之间的数字,只知道它是高于还是低于我之前的猜测

现在我有一个适用于所有情况的代码,但它超出了猜测限制,即仅31

status = ""
high = 2000000000
low = 1
num = low
print num
while 1:
    status= raw_input()
    if status== "OK":
        break
    elif status == "Higher":
        low = num
    elif status == "Lower":
        high = num
    num = int((high+low)/2)
    print num
我所做的是从最低的数字开始,作为我的第一个猜测,并根据响应重置低和高


你能帮我找到一个更快的方法吗?

你正在使用最好的算法。除了编辑以解释乔纳森的评论:你最初的猜测尽可能糟糕。将初始猜测值设为intlow+high/2。这将使整个循环的次数减少1

你要做的是二进制搜索。如果你想猜的数字真的是随机的,那么你就做不到更好的了

想想如果你每次都猜不到中点会发生什么。当你猜测的一边比另一边有更多的值时,你试图找到的数字更有可能是一边有更多的值。因此,大多数情况下,消除的值不到一半。因此,通常情况下,你会遇到更难解决的问题。如果每次取中点,则每次将值的数量减半。如果你取了一些其他的值,那么平均来说,你还有一半以上的值

所以我建议的唯一改变是从

num = int((high+low)/2)
值得考虑使用

(high+low)//2

而不是调用int。无论您使用的是python 2还是python 3,这都会返回一个整数:高+低/2在两个版本的python中会有不同的行为。

将起始位置更改为范围的中间位置:

num = low
应该是:

num = int((low + high) / 2)

这是最快的方法,它被称为。

看起来你实际上是从低开始的,而不是中间的数字。2E9<2^31,因此你应该能够在31次猜测或更少的时间内得到答案。你需要从适当的猜测公式开始-高+低//2是最好的,顺便说一句,从1开始,你几乎浪费了整整一点信息,因为你在绝大多数情况下都会得到更高的响应。不完全是:最初的猜测是次优的。我在帖子中看到了中间数字作为我的第一个猜测,没有仔细检查代码。