2

2つのbash配列a=(1 2 3 4 5)b=(12 23 21 2 3)。順列の後で、配列の1がa3番目の位置に移動し、配列の12bも3番目の位置に移動するように、それらを並べ替える必要があります。

編集:私の質問をより明確にするため。私がやろうとしていることを説明しようと思います。配列の要素をランダムにシャッフルして、要素の位置を変更する必要があります。次に、最初の配列と同じサイズの別の配列が与えられます.2番目の配列の要素を最初の配列としてシャッフルする必要があります。

4

2 に答える 2

2

シェルコマンド(coreutils)を使用してこれを実行しshuf、配列をシャッフルしてみてください。

$ a=(0 1 2 3 4 5) c=0
$ for i in $(shuf -i 0-$(( ${#a[@]} -1)) ); do b[i]=${a[c++]}; done
$ echo ${b[@]}
2 1 3 0 4 5
于 2012-11-10T21:18:00.647 に答える
-1

インデックスが常に1..5の場合、これは機能するはずです

b=(${b[a[1-1]-1]} ${b[a[2-1]-1]} ${b[a[3-1]-1]} ${b[a[4-1]-1]} ${b[a[5-1]-1]})

aが0..4のインデックスに登録されていると、より簡単になります。

b=(${b[a[0]]} ${b[a[1]]} ${b[a[2]]} ${b[a[3]]} ${b[a[4]]})

それ以外の場合は、次のように3番目の配列pを作成すると便利です。ここで、pは{0 .. $((n-1))}の順列です。

p=(3 0 1 2 4)
a=(${a[p[0]]} ${a[p[1]]} ${a[p[2]]} ${a[p[3]]} ${a[p[4]]})
b=(${b[p[0]]} ${b[p[1]]} ${b[p[2]]} ${b[p[3]]} ${b[p[4]]})

配列を任意のサイズにすることができる場合

atmp=("${a[@]}")
btmp=("${b[@]}")
for ((i=0;i<n;i++)); do
    a[i]=${atmp[p[i]]}
    b[i]=${btmp[p[i]]}
done

これは順列の方向を変える可能性があることに注意してください:

atmp=("${a[@]}")
btmp=("${b[@]}")
for ((i=0;i<n;i++)); do
    a[p[i]]=${atmp[i]}
    b[p[i]]=${btmp[i]}
done
于 2012-11-10T21:00:03.577 に答える