繁体   English   中英

Bash 生成一个正负之间的随机数

[英]Bash Generate a random number between a positive and a negative

我必须编写一个程序,它在随机旋转的图像上显示一些单词。 我希望这些介于 -30 和 30 ° 之间。 但是我在 bash/UNIX 中没有找到任何可以生成正负之间的随机数的命令。

感谢您的帮助。

@Barmar 在评论中已经提出了正确的方法(不产生外部进程)。

如果 OP 需要解开它,这里是:

angle=$(($RANDOM%61-30))

但我想建议一个更糟糕的选择,正如有人说“更糟更好”

angle=$(seq -30 30 | shuf -n 1) 
  • seq将一个整数序列放入stdout ,以换行符分隔,
  • shuf随机shuf其输入,
    • -n 1选项意味着只输出第一个随机排列的行,

这样我们就可以生成一副牌,编号为-30 ... +30 ,我们洗牌并只处理第一张牌。

我喜欢在我的回答中更清楚地说明解决方案的范围,至少从非数学天才的 POV 来看。

相反,它比使用$RANDOM

10:31 boffi@debian:~ $ time for i in {1..10000} ; do echo > /dev/null ; done

real    0m0.077s
user    0m0.036s
sys     0m0.040s
10:32 boffi@debian:~ $ time for i in {1..10000} ; do echo $(($RANDOM%61-30)) > /dev/null ; done

real    0m0.138s
user    0m0.116s
sys     0m0.020s
10:32 boffi@debian:~ $ time for i in {1..10000} ; do echo $(seq -30 30|shuf -n 1) > /dev/null ; done

real    0m33.328s
user    0m0.372s
sys     0m4.560s
10:33 boffi@debian:~ $ 

(另一方面,它只需要 3.3 毫秒,如果你在你的脚本中使用它一次...... :-)

或者按以下方式生成一个范围内的随机数,可以是正数也可以是负数:

getRand(){
    min="${1:-1}"   ## min is the first parameter, or 1 if no parameter is given           
    max="${2:-100}" ## max is the second parameter, or 100 if no parameter is given
    rnd_count=$((RANDOM%(max-min+1)+min)); #
    echo "$rnd_count"
}

var=$(getRand -10 123)
echo $var

对于更大的范围和更多的随机随机,用 SRANDOM 替换 RANDOM。 为此,您需要将终端至少更新到 5.1 版本,该版本自 2020 年底开始可用。

这是一个给出 -30 到 30 之间的随机整数的片段:

while true ; do echo $((RANDOM % 61 - 30)) ; done

更一般地,要获得 [a..b] 范围内的随机整数,请尝试:

read a b
while true ; do echo $((RANDOM % (b-a+1) + a)) ; done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM