zsh: array shuffle function
Publicado por Sandro Marcell 13/06/2009 (última atualização em 31/03/2010)
[ Hits: 7.611 ]
Homepage: http://sanmarcell.wordpress.com
Download zsh_knuth_shuffle (versão 2)
Já havia postado aqui no VOL um script com o mesmo propósito, mas resolvi reescrevê-lo e
implementá-lo por meio de uma função.
Na prática esta função (que só roda no zsh!) recebe como parâmetro um vetor qualquer e
embaralha aleatoriamente seus elementos. Ela pode ser considerada uma "quase equivalente" à
função shuffle de linguagens como Perl, PHP, etc...
Versão 2 - Enviado por Sandro Marcell em 25/03/2010
Changelog: Implementação via algoritmo Knuth-shuffle.
function shuffle
{
# Funcao que embaralha os elementos de um vetor.
# Implementado e testado sob o zsh-4.3.2
# Sandro Marcell <sandro_marcell@yahoo.com.br>
# Boa Vista, Roraima - 10/05/2009
# Executavel somente no zsh!
[ ! $ZSH_VERSION ] && return 1
RANDOM=$$
# Definindo variaveis locais e seus tipos:
local i array shuffled size index
integer i size index
typeset -a array shuffled
array=($*) # Limitado a 32767 elementos, devido a $RANDOM
# Determinando a quantidade de elementos no vetor.
size=${(w)#array}
((size > 32767)) && {
print "Ops! vetor excessivamente grande."
return 1
}
while ((i++ < size))
do
# Gera-se um valor com base no tamanho do vetor.
# Esse valor sera utilizado como indice, para
# referenciar elementos no proprio vetor.
index=$((1 + (${(w)#array} * RANDOM / 32767)))
# Utilizando-se o indice gerado, armazena-se
# o elemento por ele referenciado em 'shuffled'.
shuffled+=($array[$index])
# Para evitar que elemento armazenado seja reutilizado
# basta remove-lo de 'array'.
array[$index]=()
done
[ -n "$shuffled[*]" ] && print "$shuffled[*]" || return 1
}
Agenda de telefone em Shell usando Dialog
Estatísticas de tráfego de rede
Instalador Automático de ZoneMinder em Ubuntu
Configurando interfaces de rede
Incluindo lista de IP's nos arquivos de bloqueio do Squid automaticamente
Trabalhando Nativamente com Logs no Linux
Jogando Daikatana (Steam) com Patch 1.3 via Luxtorpeda no Linux
LazyDocker – Interface de Usuário em Tempo Real para o Docker
Apagar Todo o Histórico do Terminal
Linux Mint: Zram + Swapfile em Btrfs
Pendrive do Ubuntu 24.04 travando ao tentar fazer a instalação dual bo... (4)
Instalar Dual Boot, Linux+Windows. (14)
queria saber de uma coisa sobre o steam e derivados (3)
tentei instalar o steam pelo terminal, agora ele não abre (3)









