我想写一个代码,可以生成3行6个随机数,间隔出来,在给定的时间(0.5秒)后洗牌,没有创建新的行,基本上6个随机数在3行中继续生成。
我目前掌握的代码是:

echo " "

echo " "

echo " "



for i in {1..5};

do

for i in {1..1};

do


echo -ne " $(($RANDOM % 100))   $(($RANDOM % 100))   $(($RANDOM % 100))   $(($RANDOM % 100))   $(($RANDOM % 100))   $(($RANDOM % 100))\r"


done

sleep 0.5

done

然而,当我试图将第二行和第三行添加到这一行时,它似乎并没有按我所希望的方式工作。示例输出可能如下所示:
45 88 85 90 44 22
90 56 34 55 32 45
58 99 42 10 48 98年
在这些数字之间,将生成新的数字,只保留6列和3行。我也试过做矩阵,但对我没用。

最佳答案

我不知道你是否完成了它,但是继续从注释开始,我将用1-100之间的随机值填充索引数组,例如。

#!/bin/bash

for ((i = 0; i < 18; i++)); do      ## fill array with random values
    a[i]=$(($RANDOM % 100 + 1))
done

然后您需要的是一个可以调用的函数,传递每一行中的值的数目(这样您就可以在这些数字打印之后输出'\n'),然后将数组值作为函数的参数读取到函数中的本地数组中(当然,您可以只使用原始数组,而不必担心将元素作为参数传递,但我更喜欢在函数中使用local值来保持其他作用域中的值不变。因此,您的打印功能可能类似于:
## function to print array in shuffled order, using tput for cursor control
prnarray() {
    local n=$1
    local al=( ${@:2} )
    local c=0
    for i in $(shuf -i 0-$((${#al[@]} - 1))); do
        [ "$c" -gt '0' -a $((c % n)) -eq '0' ] && printf "\n"
        printf " %3d" "${al[i]}"
        ((c++))
    done
    printf "\n"
    tput cuu 6   ## tput is used for cursor control to move back to top
}

然后你真的不需要太多其他的bu循环来打印数组,sleep一段时间,然后再次调用prnarray来覆盖一个新的shuffle输出。例如
tput sc     ## save cursor position

## call prnarray 3 times with 5 sec. delay between displays
declare -i c=0
while (( c < 3 )); do
    prnarray 3 ${a[@]}
    ((c++))
    sleep 5
done

tput rc     ## restore cursor position

示例使用/输出
数组将每隔5秒在同一个位置打印一次,相同的元素将被洗牌到数组中的不同位置。
$ sh randomshuf.sh
  33  30  34
  86  98  48
  94  89  80
  50  57  34
  11  45  57
  80  42  22

试一试,如果你有什么问题就告诉我。
注意:要使其3x6更改行:
 tput cuu 3


prnarray 6 ${a[@]}

随着这些变化,您的输出将类似于:
$ sh randomshuf.sh
  85   9  45  14  18  16
   6  59  43  19  29  58
   7  89  18  72  29  29

关于linux - 如何在3行中生成随机数-Linux Shell脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43462892/

10-11 08:45