Bash数字猜谜游戏自动猜数功能无限循环问题求助
排查Bash自动猜数脚本无限循环问题的建议
首先,你的脚本出现无限循环的核心原因是自动猜数逻辑没有正确维护有效的数值上下边界,而是依赖pg1/pg2/pg3这些变量来回溯历史猜测,这种方式很容易在边界场景下陷入重复猜同一个数的死循环。结合你列出的黑名单数字(比如100、1、43等),我们可以一步步拆解问题并修复:
一、先定位循环发生的具体场景
在调试这类问题时,最直接的方式是添加调试日志追踪变量变化。你可以在check函数的开头加入一行日志,打印每次循环的关键变量:
check () { # 新增调试日志,直观看到变量状态 echo "Debug: guess=$guess, ll=$ll, ul=$ul, pg1=$pg1, pg2=$pg2, target=$a" # 原有代码... }
比如当目标数字是100时,你会看到脚本会依次猜50→75→87→93→96→98→99,之后就一直重复猜99——因为原有逻辑计算下一次猜测时,(99+100)/2在Bash整数除法中等于99,永远无法跳到100,最终陷入无限循环。
二、核心问题:偏离了二分法的正确逻辑
自动猜数的最优解是二分法,而二分法的关键是每次根据猜测结果严格更新上下边界,而不是用多个历史变量来回推导。你的脚本虽然初始定义了ll(下限)和ul(上限),但第一次判断后就再也没有更新过这两个变量,后续逻辑完全依赖pg系列变量,这很容易出现逻辑漏洞。
三、修复方案:改用标准二分法实现
替换你现有的自动猜数逻辑为以下代码,它会严格维护上下边界,彻底解决无限循环问题:
# 自动猜数功能(标准二分法实现) a=$((1 + $RANDOM % 100)) lower_limit=1 upper_limit=100 attempts=0 while true; do attempts=$((attempts + 1)) # 计算当前猜测值,用 (lower + upper)/2 确保每次取区间中间值 guess=$(( (lower_limit + upper_limit) / 2 )) if [ $guess -eq $a ]; then echo -e "\n${guess} - Correct guess!. No. of attempts taken: $attempts" exit 0 elif [ $guess -gt $a ]; then echo -e "\n${guess} - Too High!" # 目标在更小的区间,更新上限为当前猜测值-1 upper_limit=$((guess - 1)) else echo -e "\n${guess} - Too Low!" # 目标在更大的区间,更新下限为当前猜测值+1 lower_limit=$((guess + 1)) fi done
四、验证原有黑名单数字
用上面的代码测试你黑名单里的数字(比如100、1、43等),会发现所有数字都能被正确猜出,不会再出现无限循环。
五、额外的优化建议
- 可以添加一个安全判断:如果
lower_limit大于upper_limit,说明出现异常(比如目标数字不在1-100范围内),直接退出循环并提示错误。 - 把自动猜数逻辑封装成独立函数,和手动模式的代码分离,提高脚本的可读性和可维护性。
内容的提问来源于stack exchange,提问作者Anaam
相关产品推荐
相关产品推荐

