Shell脚本随机数生成

7

var=$RANDOM 可以创建随机数,但如何指定一个范围,比如在 0 和 12 之间?

6个回答

12

如果你已经有了随机数,你可以这样说

var=$RANDOM
var=$[ $var % 13 ]

0..12 中获取数字。

编辑: 如果您想要生成从 $x$y 的数字,您可以轻松修改此代码:

var=$[ $x + $var % ($y + 1 - $x) ]

8

0到12(含)之间:

echo $((RANDOM % 13))

编辑:请注意,此方法并不严格正确。因为32768不是13的倍数,所以生成0到8的几率略高(0.04%)于其余数字(9到12)。

这里是一个shell函数,应该可以给出平衡的输出:

randomNumber()
{
  top=32768-$((32768%($1+1)))
  while true; do
    r=$RANDOM
    [ r -lt $top ] && break
  done
  echo $((r%$1))
}

当然,如果范围的上限超过32767,则应设计更好的解决方案。

7

在Linux上(或者准确地说是coreutils),可以使用shuf来实现另一种方法:

var=$(shuf -i0-12 -n1)

2
呃,那你的代码就不具有移植性了。 - Edward Falk

3

Here you go

echo $(( $RANDOM % 12 ))

我希望这能有所帮助。

1
更正:$(( $RANDOM % 13 )) - Hai Vu
是的,同意,谢谢。我太兴奋了,首先回答一个简单的问题,没有仔细测试!感谢两个赞(不管你是谁);-) - shellter
请注意,内部的 $ 是可选的,因为那里找不到非数值字符串,只能是变量名。 - jlliagre

1

1
在FreeBSD和可能的其他BSD上,您可以使用:


jot -r 3 0 12

这将创建从0到12(含)的3个随机数。
另一种选择是,如果每个脚本只需要一个随机数,可以执行以下操作:
var=$(( $$ % 13 ))

这将使用脚本的PID作为种子,应该是大部分随机的。范围再次从0到12。

1
Mac OS X 也有 jot。但是 Linux 没有,所以这不具备可移植性。 - Edward Falk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接