Uma maneira de misturar com intensidade variada pode ser pegar uma lista ordenada e fazer um número variável de permutações aleatórias (certificando-se de que os elementos não sejam movidos mais de uma vez).
shuffle() {
awk -v n="$1" '
{line[NR]=$0; i[NR] = NR}
END{
if (n > NR/2) {
print "two many permutations"
exit(1)
}
srand()
for (x = 1; x <= NR; x++) {
# shuffle the list of indicies
y = int(rand() * NR) + 1
tmp = i[x]; i[x] = i[y]; i[y] = tmp
}
for (x = 1; x <= n; x++) {
# get the lines to permute from the head of the shuffled
# list of indices
y = i[x*2-1]; z = i[x*2]
tmp = line[y]; line[y] = line[z]; line[z] = tmp
}
for (x = 1; x <= NR; x++) print line[x]
}'
}
$ seq 10 | shuffle 0 | paste -sd , -
1,2,3,4,5,6,7,8,9,10
$ seq 10 | shuffle 1 | paste -sd , -
1,2,6,4,5,3,7,8,9,10
$ seq 10 | shuffle 5 | paste -sd , -
9,6,5,10,3,2,8,7,1,4
shuffle 5
garantirá que nenhum dos elementos manterá sua posição original (embaralhar n
garante que 2 * n elementos obtenham uma posição diferente). Existem alguns shufflings que nunca serão alcançados. Para uma lista 1,2,3, por exemplo, os únicos resultados possíveis são 2,1,3
, 3,2,1
e 1,3,2
. Não 3,1,2
Com um shuffle 5
, você também pode acabar com 6,7,8,9,10,1,2,3,4,5
, o que talvez não seja muito embaralhado.