我想创建四个字符串,每个字符串具有随机长度,但它们的总长度应为10.因此可能的长度组合可能是:
3 3 3 1
或
4 0 2 2
然后(分别)会产生这样的字符串:
111 222 333 4
或
1111 33 44
我怎么能这样做?
答案 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