zsh: array shuffle function

Publicado por Sandro Marcell 13/06/2009 (última atualização em 31/03/2010)

[ Hits: 7.366 ]

Homepage: http://sanmarcell.wordpress.com

Download zshuffle

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ões atualizadas deste script

Versão 2 - Enviado por Sandro Marcell em 25/03/2010

Changelog: Implementação via algoritmo Knuth-shuffle.

Download zsh_knuth_shuffle


Esconder código-fonte

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
}

Scripts recomendados

Script para monitorar memória do servidor

Script que busca IP Livres em uma rede

Usando variáveis em shell script

Remover espaços em branco em nomes de arquivos

SImples calculadora em Shell


  

Comentários
[1] Comentário enviado por SMarcell em 14/06/2009 - 16:45h

Só pra constar, aqui está a versão original:
http://www.vivaolinux.com.br/script/Embaralhando-elementos-de-um-vetor


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts