Bash在正面和负面

时间:2016-10-14 02:22:46

标签: linux bash random between

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

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

OP是否需要解开,这是:

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

但是我想建议一个更糟糕的选择,就像有人说的那样#34;更糟糕的是更好"

angle=$(seq -30 30 | shuf -n 1) 
  • seqstdout提出一系列整数,换行符,
  • 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毫秒,如果你在脚本中使用ONCE ......: - )

答案 1 :(得分:1)

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

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 年底开始可用。

答案 2 :(得分:0)

这是一个片段,它提供-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