Bash 生成正负之间的随机数
Bash Generate a random number between a positive and a negative
我必须编写一个程序,在随机旋转的图像上显示一些文字。我希望这些在例如 -30 和 30° 之间。但是我没有在bash/UNIX中找到任何可以生成正负之间随机数的命令。
感谢您的帮助。
这是一个给出 -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
@Barmar 已经在评论中提出了正确的方法(没有产生外部进程)。
如果 OP 需要解开它,这里是:
angle=$(($RANDOM%61-30))
但我想提出一个更糟糕的选择,正如有人所说 "Worse is better"
angle=$(seq -30 30 | shuf -n 1)
seq
放入 stdout
整数序列,换行符分隔,
shuf
随机打乱其输入,
-n 1
选项意味着只输出第一个 随机打乱的 行,
这样我们就可以生成一副牌,编号为 -30
… +30
,我们洗牌并只发第一张牌。
我喜欢我的回答是解的范围表述得更清楚,至少从一个没有数学天赋的人的视角来看是这样。
相反,它比使用 $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
要获得更大的范围和更随机的随机数,请将 RANDOM 替换为 SRANDOM。为此,您需要至少将终端更新到 5.1 版本,该版本将于 2020 年底推出。
我必须编写一个程序,在随机旋转的图像上显示一些文字。我希望这些在例如 -30 和 30° 之间。但是我没有在bash/UNIX中找到任何可以生成正负之间随机数的命令。
感谢您的帮助。
这是一个给出 -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
@Barmar 已经在评论中提出了正确的方法(没有产生外部进程)。
如果 OP 需要解开它,这里是:
angle=$(($RANDOM%61-30))
但我想提出一个更糟糕的选择,正如有人所说 "Worse is better"
angle=$(seq -30 30 | shuf -n 1)
seq
放入stdout
整数序列,换行符分隔,shuf
随机打乱其输入,-n 1
选项意味着只输出第一个 随机打乱的 行,
这样我们就可以生成一副牌,编号为 -30
… +30
,我们洗牌并只发第一张牌。
我喜欢我的回答是解的范围表述得更清楚,至少从一个没有数学天赋的人的视角来看是这样。
相反,它比使用 $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
要获得更大的范围和更随机的随机数,请将 RANDOM 替换为 SRANDOM。为此,您需要至少将终端更新到 5.1 版本,该版本将于 2020 年底推出。