zsh: Sattolo's Random Cyclic Permutation
Simples função que implementa uma variante do algoritmo Fisher-Yates shuffle. Esta implementação foi descrita pela pesquisadora italiana Sandra Sattolo.
Descrição
Simples função que implementa uma variante do algoritmo Fisher-Yates shuffle. Esta implementação foi descrita pela pesquisadora italiana Sandra Sattolo.
#
# Sattolo's Random Cyclic Permutation
# -- Variante do algoritmo Fisher-Yates shuffle
# Sandro Marcell <sandro_marcell@yahoo.com.br>
# Boa Vista, Roraima - 21/03/2010
#
function sattoloCycle {
zmodload zsh/mathfunc
(( rand48(seed) ))
typeset -a array swap
integer n k
array=(${*=})
(( n = ${(w)#array} + 1 ))
while ((n > 1))
do
((--n))
(( k = int((n - 1) * rand48()) + 1 ))
swap+=$array[k]
array[k]=$array[n]
array[n]=$swap
done
return 0
}