进行二分查找猜测随机数,但猜测次数不匹配

1 投票
2 回答
3377 浏览
提问于 2025-04-17 20:03

我写了一个简单的猜数字游戏,还有一个方法来进行猜测……

    from gasp import *

    number = random_between(1, 1000)
    guesses = 0

    while True:
        guess = input("Guess the number between 1 and 1000: ")
        guesses += 1
        if guess > number:
            print "Too high!"
        elif guess < number:
            print "Too low!"
        else:
            print "\n\nCongratulations, you got it in %d guesses!\n\n" % guesses
            break

根据题目的要求,如果使用正确的策略,最多应该猜11次。我用二分查找的方法来找出正确的数字,但实际上猜的次数从来没有超过10次。为了验证这一点,我做了以下操作,结果出现了一个无限循环。

    from gasp import *


    guesses = 0
    big = 1000
    small = 1
    while guesses != 11
        number = random_between(1, 1000)
        while True:
            guess = (big + small) / 2
            guesses += 1
            if guess > number:
                print "Too high!"
                big = guess
            elif guess < number:
                print "Too low!"
                small = guess
            else:
                print "\n\nCongratulations, you got it in %d guesses!\n\n" % guesses
                break

那么,到底谁对呢?是我哪里出错了,还是说所需的猜测次数根本不能超过10次,题目本身就有问题。

2 个回答

1

我们来看看:

A number between 1 and  1 requires 1 guess
A number between 1 and  3 requires 2 guesses at most
A number between 1 and  7 requires 3 guesses at most
A number between 1 and 15 requires 4 guesses at most
A number between 1 and 31 requires 5 guesses at most
...

换句话说,n 次猜测就足够覆盖从 1(2**n)-1 的范围。

比如说,当 n=10 时,这个范围就是从 11023。因为 1023 >= 1000,所以你关于十次猜测的结论是对的。

不过,你用来验证这个结论的代码有问题,因为每次你要猜下一个数字时,bigsmallguesses 这些变量没有重新初始化。此外,与其随机生成数字,不如直接测试从 1 到 1000 的每一个数字,这样你就能有一个确定的算法,运行时间也是有限的。

2

在编程中,有时候我们需要处理一些数据,比如从一个地方获取信息,然后在另一个地方使用这些信息。这个过程就像是把水从一个水桶倒到另一个水桶里。

有些时候,我们会遇到一些问题,比如数据格式不对,或者数据丢失了。这就像是你在倒水的时候,发现水桶有个洞,水漏掉了。为了避免这种情况,我们需要确保在处理数据时,所有的步骤都正确无误。

此外,编程中还有一些工具和方法可以帮助我们更好地管理这些数据。就像是用漏斗来倒水,可以减少溅出来的水。通过使用这些工具,我们可以让我们的程序更加高效和可靠。

总之,处理数据就像是一个精细的过程,需要我们仔细操作,确保每一步都做到位,这样才能得到想要的结果。

>>> from math import log, ceil
>>> ceil(log(1000, 2))
10.0

撰写回答