Bash / shell脚本:创建四个具有固定总长度的随机长度字符串

时间:2015-10-29 12:20:49

标签: bash shell unix

我想创建四个字符串,每个字符串具有随机长度,但它们的总长度应为10.因此可能的长度组合可能是:

3    3    3    1

4    0    2    2

然后(分别)会产生这样的字符串:

111    222    333    4

1111    33    44

我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

这是一个算法:

使用随机长度制作前3个字符串,该长度不大于长度的总和(每次减去它)。其余的长度 - 这是你的最后一根字符串。

考虑一下:

sumlen=10
for i in {1..3}
do
   strlen=$(($RANDOM % $sumlen)); sumlen=$(($sumlen-$strlen)); echo $strlen
done
echo $sumlen

这将输出你的长度,现在你可以创建字符串,假设你知道如何

答案 1 :(得分:3)

$RANDOM将为您提供范围0..32767中的随机整数。 使用一些算术扩展,您可以:

remaining=10

for i in {1..3}; do
    next=$((RANDOM % remaining)) # get a number in range 0..$remaining
    echo -n "$next "                 
    ((remaining -= next))
done
echo $remaining

更新:要重复N次,你可以使用这样的函数:

repeat() {
    for ((i=0; i<$1; i++)); do
        echo -n $1
    done
    echo                                         
}

repeat 3
333

答案 2 :(得分:2)

替代awk解决方案

 awk 'function r(n) {return int(n*rand())} 
      BEGIN{srand(); s=10; 
            for(i=1;i<=3;i++) {a=r(s); s-=a; print a} 
            print s}'

3
5
1
1

srand()设置随机种子,否则每次都会生成相同的随机数。

在这里,您可以将生成字符串的下一个任务组合到同一个awk脚本中

$ awk 'function r(n) {return int(n*rand())}; 
       function rep(n,t) {c="";for(i=1;i<=n;i++) c=c t; return c}
       BEGIN{srand(); s=10; 
             for(j=1;j<=3;j++) {a=r(s); s-=a; printf("%s ", rep(a,j))}
             printf("%s\n", rep(s,j))}'

产生

1111 2 3 4444