Pular para o conteúdo

zsh: array shuffle function

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...
Sandro Marcell SMarcell
Hits: 7.696 Categoria: Shell Script Subcategoria: Variáveis
  • Download
  • Nova versão
  • Indicar
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Descrição

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...
Download zshuffle Enviar nova versão
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Versões atualizadas deste script

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
}
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Bomba.sh - Estouro de memória RAM com Menu

Instalando OCR apps no seu Debian.

cpb - Copia arquivos executáveis...

Script para manipulação fácil e rápida de usuários no Linux

Limpar logs do sistema

Contribuir com comentário

Entre na sua conta para comentar.