Bash指定范围生成随机数出现意外输出问题求助
Bash猜数字游戏随机数生成问题修复
问题分析
你的代码存在两个核心问题导致结果不符合预期:
$RANDOM的调用特性
Bash中$RANDOM每次被引用时都会生成一个新的0-32767之间的随机整数。你计算randNum时用的$RANDOM和后续echo输出的$RANDOM是两个完全不同的值,这就是为什么你用输出的RANDOM=9237验证计算结果时,和实际得到的randNum=5对不上——实际计算用的是另一个随机数。随机数范围计算缺失偏移量
当前公式$RANDOM % ( ($upperBound - $lowerBound) + 1 )只能生成0到(upperBound - lowerBound)之间的整数,没有加上lowerBound来偏移到你设定的目标区间。比如第二个测试案例中,生成的0加上123才是合法的123,但直接输出0就超出了123-126的范围。
另外,你的上下界验证逻辑存在不合理限制:当前要求upperBound必须大于lowerBound+1,这会拒绝上下界相等的合法场景(比如用户希望生成固定值5,输入上下界都是5)。
修正后的代码
echo "Enter the lower bound: " echo -n "> " read lowerBound while [ "$lowerBound" -lt 0 ] do echo "Lower bound must be >= 0. Please try again: " echo -n "> " read lowerBound done echo echo "Enter the upper bound: " echo -n "> " read upperBound # 修正上下界验证:允许上下界相等 while [ "$upperBound" -lt "$lowerBound" ] do echo "Upper bound must be >= lower bound. Please try again: " echo -n "> " read upperBound done echo # 保存当前RANDOM值,避免多次调用生成不同结果 current_random=$RANDOM # 计算目标区间的长度 range_length=$((upperBound - lowerBound + 1)) # 生成[lowerBound, upperBound]范围内的随机数 rand_num=$((lowerBound + current_random % range_length)) # 输出计算时用的随机数和最终结果 echo "RANDOM=$current_random randNum=$rand_num"
关键修改说明
- 固定$RANDOM值:将
$RANDOM保存到变量current_random中,确保计算和输出用的是同一个随机数,验证结果时能对应上。 - 补全偏移量计算:通过
lowerBound + current_random % range_length,把生成的0到(range_length-1)的偏移量,映射到[lowerBound, upperBound]区间内。 - 调整上下界验证逻辑:将判断条件改为
upperBound < lowerBound,允许上下界相等的场景,符合游戏的合理需求。
内容的提问来源于stack exchange,提问作者UnsanitizedInput
相关产品推荐
相关产品推荐

