私はそれを使っseq
て乱数リスト(1、2、3、4...)を生成できることを知っています。
この数字を3、1、4、2のようにランダムな順序で入力したいと思います。
私はshuf
ファイルの行を混乱させるために何を使用できるかを知っています。したがって、これを使用してseq
ファイルにランダムな数字を書き、shuf
それをシャッフルしたり、いくつかの種類のシャッフル機能を作成したりできます。しかし、これは不必要に複雑に見えます。単一のコマンドを使用して配列内の項目をランダムに指定する簡単な方法はありますか?
答え1
出力をshuf
。
$ seq 100 | shuf
はい
$ seq 10 | shuf
2
6
4
8
1
3
10
7
9
5
出力を水平にするには、パイプで接続してくださいpaste
。
$ seq 10 | shuf | paste - -s -d ' '
1 6 9 3 8 4 10 7 2 5
$ seq 10 | shuf | paste - -s -d ' '
7 4 6 1 8 3 10 5 9 2
$ seq 10 | shuf | paste - -s -d ' '
9 8 3 6 1 2 10 4 7 5
の間にカンマを入れますか?区切り文字を次に変更しますpaste
。
$ seq 10 | shuf | paste - -s -d ','
2,4,9,1,8,7,3,5,10,6
答え2
単一のコマンドを使用して配列内の項目をランダムに指定する簡単な方法はありますか?
10進整数配列があるとしましょう。
arr=(4 8 14 18 24 29 32 37 42)
sumを使用して配列要素をランダムprintf
に指定できます。shuf
$ arr=($(printf "%d\n" "${arr[@]}" | shuf))
$ echo "${arr[@]}"
4 37 32 14 24 8 29 42 18
(上記では修正していないと仮定します$IFS
。)
などの2つの整数の間の乱数のみが必要な場合は、次の10
オプションを使用する20
以外に追加の手順は必要ありません。shuf
-i
$ shuf -i 10-20
12
10
20
14
16
19
13
11
18
17
15
引用元man shuf
:
-i, --input-range=LO-HI
treat each number LO through HI as an input line
答え3
printf '%s, ' `seq 1 10 | shuf`
ループも必要ありませんfor
。
出力
7, 3, 4, 10, 2, 9, 1, 8, 5, 6,
これをシェル配列に入れるには:
( set -- $(seq 1 10 | shuf) ; printf '%s, ' "$@" )
出力
5, 9, 7, 2, 4, 3, 6, 1, 10, 8,
それからシェル配列にあります。
シェル配列に入れると、以下は必要ありませんprintf
。
( set -- $(seq 1 10 | shuf); IFS=, ; echo "$*" )
出力
9,4,10,3,1,2,7,5,6,8
ところで、seq
彼らはprintf
完全に一致しています。たとえば、文字列を1000回繰り返したい場合はどうすればよいですか?
printf 'a string\n%.0b' `seq 1 1000`
出力
a string
... a string
999行目後で...
a string
または...
printf 'a string,%.0b' `seq 1 10`
出力
a string,a string,a string,a string,a string,a string,a string,a string,a string,a string,
コマンドを39回実行したいですか?
printf 'echo "run %d"\n' `seq 1 39` | . /dev/stdin
出力
run 1
...38run
行目以降...
run 39
答え4
shuf
次のコマンドを使用して、出力をランダムに指定できます。
%> for x in $(seq 1 10 | shuf); do echo -n "$x "; done; echo
4 10 8 7 1 6 3 5 2 9