生成符合Bash范围的随机数

时间:2017-04-21 03:26:46

标签: bash random arguments

如果我运行<tr ng-repeat="x in names.retRows"> ,则只返回./random.sh 10 4510之间的随机数。

我可以使用

生成随机数
45

但现在如何允许用户指定随机数的上限和下限?

4 个答案:

答案 0 :(得分:3)

您可以使用shuf

#!/bin/bash

# $1: Lower limit
# $2: Upper limit
# Todo  Check arguments

shuf -i $1-$2 -n 1

./random.sh 45 50

答案 1 :(得分:2)

尝试以下(纯BASH):

   low=10
   hgh=45
   rand=$((low + RANDOM%(1+hgh-low)))

答案 2 :(得分:1)

我们的想法是将您的范围设置为默认下限,例如10,并设置更高的边界,例如45。所以你调整下限是这样的:$RANDOM % 45 + 10,不是吗?

但是此解决方案存在问题,它假设您始终位于0 + 1045之间,所以事实上它会一直有效,直到您达到35(35 + 10 = 45你的更高的界限),超过35将超出你的范围。

为了保持在范围内的解决方案是$RANDOM % (higher_b - lower_b),这将允许你保持在更高的界限,然后添加下限,这给你:

$RANDOM % (45 -10) + 10

示例错误输出:

for i in {0..10};do printf $[RANDOM % 45 + 10]" ";done
47 31 53 23 36 10 22 36 11 25 54

示例右输出:

for i in {0..10};do printf $[RANDOM % 35 +10]" ";done
39 44 14 12 38 31 25 13 42 33 16

如果您希望索引包含更高的界限,也可以写RANDOM % (higher - lower +1)

答案 3 :(得分:1)

模数的问题是$RANDOM % N,除非N是2的幂,否则所有结果的概率分布都不相同:How to generate random number in Bash?。每man bash$RANDOM产生0到32,767之间的数字(2 ** 15-1)。在某些情况下,这可能并不重要,但通过略微重写表达式,我们可以获得相同的分布。

for i in {0..10}; do echo -n "$((RANDOM*36/32768 + 10)) "; done; echo

具有用户可选范围的bash脚本:

#!/bin/bash
LOW=$1
HIGH=$2
echo $((RANDOM * ($HIGH-$LOW+1) / 32768 + LOW))

您还需要进行一些参数检查。