【问题标题】:Generating random number with bounds produces unexpected output in Bash生成带边界的随机数在 Bash 中产生意外输出
【发布时间】:2023-02-03 02:40:43
【问题描述】:

我正在尝试学习 bash,所以我正在研究“猜数字”类型的游戏。我正试图根据用户输入的下限和上限生成随机数。但是一些测试用例似乎创建了没有意义的数字;有些超出了我的范围,有些则不是我所期望的。

这是我的程序

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

lowerLimit=$(($lowerBound + 1))

while [ "$upperBound" -lt "$lowerLimit" ]
do
    echo "Upper bound must be larger than lower bound. Please try again: "
    echo -n "> "
    read upperBound
done

echo
randNum=$(( $RANDOM % ( ($upperBound - $lowerBound) + 1 ) ))
echo "RANDOM=$RANDOM randNum=$randNum"

这是产生意外结果的输出。我希望 6: (9237 % (10-1+1) = 7 但输出是 5)

Enter the lower bound:
> 1

Enter the upper bound:
> 10

RANDOM=9237 randNum=5

最后这里是一些输出,其中生成的数字超出了我的范围。我通过自己做数学来理解这一点,但认为这个方程应该生成一个范围内的随机数。这里 26921 % (126-123+1) = 9237。9237 在后续运行中出现很可能只是巧合。

Enter the lower bound:
> 123

Enter the upper bound:
> 126

RANDOM=26921 randNum=0

我不确定我的等式是否有误,或者我在 Bash 中做错了什么。任何指针将不胜感激。

注意:我不是编程新手,只是 Bash 新手。

【问题讨论】:

    标签: bash random


    【解决方案1】:

    $RANDOM 的每个引用都会生成一个新号码。

    您可以通过以下简单的方式看到这一点:

    $ echo "$RANDOM : $RANDOM : $RANDOM"
    297 : 20330 : 14461
    

    在您的代码中,当您计算 randNum 时,您会得到一个 $RANDOM 值,而第二个(很可能不同的) $RANDOMecho中的值;最终结果是 randNum=5 不是基于 $RANDOM=9237 生成的。

    如果您想多次引用相同的$RANDOM值,您应该首先将其存储在一个变量中,然后根据需要(重新)使用该变量,例如:

    ranx=$RANDOM
    randNum=$(( $ranx % ( ($upperBound - $lowerBound) + 1 ) ))
    echo "RANDOM=$ranx randNum=$randNum"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多