python练习:验证二分法查找法猜数字

首先,在数学上有一个经典的搜索算法,二分查找法,即每次都猜**(最大值+最小值)/2的那个值,根据反馈的结果大小继续查找,直到找到结果。通过二分查找法,每次获得的搜索范围都比以前要减小一半,当n=1000,logn的值为10,所以最多查找次数不超过10**次,我们来检验一下!

第一步:编写一个二分查找法的小程序

import random
#guessnumber.py
#验证二分法查找法最多次数为logn

"单轮测试结果"
target = random.randint(1,1000)# 随机获得一个1-1000之内的整数作为要被猜的数字
print("target= %d"%target)
guess = random.randint(1,1000)# 随机获得一个1-1000之内的整数作为第一次尝试猜测的数字
count = 0# 赋猜测次数初始值为0次
max = 1000# 赋最大值初始值
min = 0# 赋最小值初始值
while True:
    if guess < target:
        print("guess%d= %d is smaller than target"%(count,guess))
        min = guess# 猜测数字小了,将此次猜测结果赋给min,作为下次最小值
        guess = (guess + max)//2
        count += 1
    elif guess > target:
        print("guess%d= %d is bigger than target"%(count,guess))
        max = guess# 猜测数字大了,将此次猜测结果赋给max,作为下次最大值
        guess = (min + guess)//2
        count += 1
    else:
        print("guess%d= %d is right!"%(count,guess))
        break
print("Total number is %d"%count)

测试结果截图:
在这里插入图片描述
由图可见,次数为8次,确实不超过10次就查找到了准确值。
可这只是一次测试,会不会是偶然,所以要设计一个循环在多次测试中统计结果判断是否都在10次之内。

第二步:编写一个循环测试100次二分查找法的小程序
ps:为了方便我把第一步的程序封装起来,并且为了显示结果简单,删除了每次打印每次输出结果。直接输出最后成功次数。

import random
#guessnumber.py
#验证二分法查找法最多次数为logn


def binary_search():
    "单轮测试结果"
    target = random.randint(1,1000)# 随机获得一个1-1000之内的整数作为要被猜的数字
    # print("target= %d"%target)
    guess = random.randint(1,1000)# 随机获得一个1-1000之内的整数作为第一次尝试猜测的数字
    count = 0# 赋猜测次数初始值为0次
    max = 1000# 赋最大值初始值
    min = 0# 赋最小值初始值
    while True:
        if guess < target:
            # print("guess%d= %d is smaller than target"%(count,guess))
            min = guess# 猜测数字小了,将此次猜测结果赋给min,作为下次最小值
            guess = (guess + max)//2
            count += 1
        elif guess > target:
            # print("guess%d= %d is bigger than target"%(count,guess))
            max = guess# 猜测数字大了,将此次猜测结果赋给max,作为下次最大值
            guess = (min + guess)//2
            count += 1
        else:
            # print("guess%d= %d is right!"%(count,guess))
            break
    # print("Total number is %d"%count)
    if count <= 10:
        return True# 在10次之内返回真
    else:
        return False# 返回假

rcount = 0# 测试成功次数初始值0
ecount = 0# 测试失败次数初始值0
for i in range(100):
    if binary_search():
        rcount += 1
    else:
        ecount += 1
print("success_number:%d,fail_number:%d"%(rcount,ecount))

测试结果:
在这里插入图片描述
可见测试100次全部正确,当然换成一千一万次都会成功的,这里就不演示了,这里代码还可以再封装到类里然后可以用户输入测试次数运行,然后打包成一个测试小软件的样子,有兴趣可以去尝试,这里要用到pyinstaller库打包py文件为exe文件。

一起学python的朋友可以和我这个小白一起,加关注互粉

猜你喜欢

转载自blog.csdn.net/qq_43582207/article/details/107243464
今日推荐