从三个数字(10、100 和 1000)中随机选择的变量

Esp*_*sen 19 shell-script random variable

是否有可能从三个预先确定的数字中选择一个随机数的变量?

样本:

var= 10 or 100 or 1000
Run Code Online (Sandbox Code Playgroud)

Ale*_*exP 31

使用数组保存值并使用内置变量在其中进行选择$RANDOM。例如,

x[0]=10     # One decade
x[1]=100    # One century
x[2]=1000   # One millennium

for ((i=1; i < 20; ++i)); do echo -n " ${x[$RANDOM%3]}"; done; echo
1000 10 10 10 10 100 10 100 100 10 10 100 100 100 10 1000 1000 1000 10
Run Code Online (Sandbox Code Playgroud)

随机性的质量不会是最好的(/dev/urandom为此读取字节),但它对于脚本来说应该足够好了。

注 1:正如人们在评论中所观察到的那样,当然可以使用数组 literal: 代替单独初始化数组元素x=(10 100 1000)

注 2:不是对数组中的元素数量进行硬编码,而是可以通过 提取随机元素${x[$RANDOM%${#x[@]}]}

  • +1 虽然 zeppelin 的答案在这种特殊情况下很聪明,但数组方法要通用得多。 (5认同)
  • 似乎 `x=(10 100 1000)` 从 bash 中的文字创建一个数组,这将更具可读性和更惯用 (4认同)

zep*_*lin 29

如果您使用bash(或zshksh93),您可以这样做:

echo "$((10**($RANDOM%3+1)))"
Run Code Online (Sandbox Code Playgroud)

或者

var=$((10**($RANDOM%3+1)))
Run Code Online (Sandbox Code Playgroud)

将其分配给var


Dig*_*uma 20

您还可以使用 GNU coreutilsshuf实用程序

a=$(shuf -n1 -e 10 100 1000)
Run Code Online (Sandbox Code Playgroud)

不过RANDOM,按照其他答案使用几乎肯定会更快。


Dop*_*oti 8

case $(( RANDOM % 3 )) in
    0)
        var=10
        ;;
    1)
        var=100
        ;;
    2)
        var=1000
        ;;
esac
Run Code Online (Sandbox Code Playgroud)


Dig*_*uma 5

这是一个有点神秘的方式:

printf -v var '1%0*d' $(( RANDOM % 3 + 1 )) 0
Run Code Online (Sandbox Code Playgroud)

这将$var根据需要分配随机值。该printf格式串是1%0Nd-这将导致0要被打印与N前导零,其中,N将在间隔的随机整数[1,3]