如何优化Python猜数字程序中计算机的猜测逻辑提升猜中效率
猜数字游戏计算机猜测效率优化方案
现有问题说明
当前代码存在两个核心问题:
- 计算机每次都在1-100全区间随机生成猜测值,完全没有利用之前"猜高了/猜低了"的反馈缩小范围,平均需要50次左右才能猜中,效率极低
- 存在两处小bug:一是
random.randrange(1,100)的取值范围是1到99,和开头提示的1-100范围不符;二是分支里的guess == number、computer_guess == number是无意义的比较语句,没有实际作用,可以直接删除。
优化思路
核心逻辑很简单:给计算机维护一个动态的猜测上下边界,每次根据上一次的猜测结果收缩边界,后续只在有效区间内生成猜测值即可。根据取值策略不同,有两种常用实现:
方案1:二分查找法(效率最优)
这是猜数字游戏的最优策略,1-100范围的数字最坏情况下只需要7次就能猜中。
- 首先在循环外初始化两个边界变量,记录当前计算机的有效猜测范围:
comp_low = 1 comp_high = 100
- 替换原来的全区间随机猜逻辑,每次取当前区间的中间值作为猜测值,猜完后根据结果更新边界:
- 如果猜低了,说明目标值比当前猜测值大,把下边界更新为
当前猜测值+1 - 如果猜高了,说明目标值比当前猜测值小,把上边界更新为
当前猜测值-1 - 猜中直接结束游戏
对应代码段替换为:
# 取当前区间中间值作为猜测 computer_guess = (comp_low + comp_high) // 2 print(f"\nThe computer guesses {computer_guess}") if computer_guess < number: print("Computer guess higher...") comp_low = computer_guess + 1 elif computer_guess > number: print("Computer guess lower...") comp_high = computer_guess - 1 else: print(f"\nGame over! The number was {number} The Computer Wins!") break
方案2:区间随机猜测(保留随机性)
如果不想让计算机用固定的二分策略,想保留随机猜测的体验,可以在收缩后的有效区间内随机选数,效率比全区间随机高很多,平均猜测次数在7-10次左右。
只需要把上面方案里取中间值的代码,换成在当前区间内随机取值即可:
# 注意randrange是左闭右开区间,所以上边界要写comp_high+1才能取到comp_high的值 computer_guess = random.randrange(comp_low, comp_high + 1)
后续更新边界的逻辑和二分法完全一致。
修改后完整参考代码(二分法版本)
print("\tWelcome to 'Guess My Number'!") print("I'm thinking of a number between 1 and 100.\nTry to guess in as few attempts as possible.") import random # 修复原范围bug,用randint生成1-100的目标数 number = random.randint(1, 100) guess = 0 # 初始化计算机猜测边界 comp_low = 1 comp_high = 100 while guess != number: guess = int(input("\nTake a guess: ")) if guess < number: print("Player guess higher...") elif guess > number: print("Player guess lower...") else: print(f"\nGame over! The number was {number} The Player Wins!") break computer_guess = (comp_low + comp_high) // 2 print(f"\nThe computer guesses {computer_guess}") if computer_guess < number: print("Computer guess higher...") comp_low = computer_guess + 1 elif computer_guess > number: print("Computer guess lower...") comp_high = computer_guess - 1 else: print(f"\nGame over! The number was {number} The Computer Wins!") break input("\nPress Enter to Exit")
内容的提问来源于stack exchange,提问作者ROCKY970
相关产品推荐
相关产品推荐

