乱数を印刷するための可変長ループを作成する方法は?

乱数を印刷するための可変長ループを作成する方法は?

ユーザーに乱数の行と列数の入力を求められたら、乱数行列を作成しようとします。入れ子になった for ループのみ使用できます。

行と列の2つの変数を作成しましたが、主な問題はforループが正しくエコーされるようにすることです。これは私のループ機能です

    for i in [1..$rows]; do
    echo "$RANDOM";
    done

私はiの値を1 + 1に増やそうとしましたが、ループは一度だけ実行されます。スクリプトが$ rowsの値を読み取るようにしたいと思います。

答え1

同様の構文はありません[x..y]{x..y}と思うかもしれませんが、それはうまくいきませんifxまたはy変数。

したがって、次のいずれかを試すことができます。

for ((i=1;i<=$rows;i++)); do
    echo "$RANDOM"
done

または

for i in $(seq 1 "$rows"); do
    echo "$RANDOM"
done

または

i=0 
while (( ++i <= rows)); do
    echo "$RANDOM"; 
done

でも

i=0
until [ $i -gt $rows ]; do 
    echo "$RANDOM"
    ((i++))
done

答え2

astden指摘、使用した構文が正しくありません。それから彼はループのいくつかの例を提示しました。会議働く

ただし、$rows任意の整数を印刷するには、次のものを使用することもできます。

jot -r "$rows"

または等しく、

jot -r "$rows" 1 100

$rows1から100までの任意の整数を出力します(jotBSDシステムまたは一部のLinuxシステムのパッケージに含まれていますathena-jot)。

または、

shuf -i 1-100 -r -n "$rows"

jot上記のコマンドと同じことを行います(shufGNU coreutilsの一部です)。

$colsタイムアイテムのマトリックスを作成するには、$rows次のものを使用できますrs(BSDシステムまたは一部のLinuxシステムのパッケージrsで利用可能)。rs

$ rows=4
$ cols=6
$ jot -r "$(( rows * cols ))" | rs "$rows" "$cols"
37  29  2   74  5   14
82  86  74  63  73  9
58  10  14  96  12  90
98  13  55  56  40  52

$rows * $cols乱数が必要であることに注意してください。ここで使用されている例では、これらの値を取得しますjotshufまたは数値を生成する他のコマンド)を使用することもできます。

答え3

そしてzsh

$ eval print -C4 '$(('{1..20}', RANDOM))'
11190  17138  16156  5735
16751  13545  22647  13244
12925  11584  10984  32387
32093  8170   5305   6102
25136  30299  3944   9956

または、GNUを使用してshuf範囲を指定します。

$ print -C4 $(shuf -i 0-99 -n 20)
96  55  93  33
25  7   19  60
34  51  88  46
79  13  70  98
63  37  69  41

関連情報