Embaralhando elementos de um vetor

Publicado por Sandro Marcell 19/03/2009

[ Hits: 7.197 ]

Homepage: http://sanmarcell.wordpress.com

Download array_shuffle




Um exemplo que mostra como embaralhar os elementos de um vetor em shell script.

Este script é um "quase equivalente" à função "shuffle" de linguagens com Perl, PHP, etc... Como dito acima, isso é apenas um exemplo, então se for o caso adapte-o (ou melhore-o!) conforme desejado.

Falou!!! =)

  



Esconder código-fonte

#!/bin/zsh -f
#
# Embaralhando de forma simples elementos dum vetor.
#
# Sandro Marcell (sandro_marcell@yahoo.com.br)
# Boa Vista, Roraima - 13/03/2009. (Sexta-feira 13!!!)
#
# Uso: script <valores>
#
# Ex.:
# ./script 1 2 3 4 5 a b c d e
# ./script `cat /etc/group`
# 
# Obs.:
# - Isto e apenas um esboco de codigo, a intencao e mostrar ao usuario uma
# forma BEM SIMPLES de embaralhar elementos dum vetor. Portanto se for o
# caso, adapte-o (ou melhore-o!) conforme desejar;
# - Os dados de entrada/saida sao tratados como vetor;
# - Este script e um 'quase equivalente' a funcao 'shuffle' de linguagens
# como Perl, PHP, etc...;
# - Quanto maior o array, melhor sera o nivel de 'embaralhamento';
# - Voce tambem pode utilizar a variavel $RANDOM, ao inves do modulo
# de funcoes matematicas do zsh;
# - Mais detalhes: 'man zsh';
# - Script passivel de melhorias! =)
zmodload -i zsh/mathfunc
seed=$$
default="zero um dois tres quatro cinco seis sete oito nove"

# 'array' tera seus elementos embaralhados e 'shuffled' os armazenara.
typeset -a array shuffled
array=($*)
shuffled=()
[ -z "$array" ] && array=($(print $default))

# O 'pulo do gato' =)
# A variavel 'size' ira conter como valor o tamanho do vetor, e com isso
# determinara a quantidade de interacoes a serem realizadas pelo loop.
size=${(w)#array}

while ((i++ < size))
do
   # Gera-se um valor com base no tamanho do vetor. Esse valor sera
   # utilizado como indice, para referenciar elementos no vetor.
   #index=$((1 + (${(w)#array} * RANDOM / 32767)))
   index=$((1 + int(${(w)#array} * rand48(seed))))

   # Utilizando o indice gerado, armazena-se o elemento por ele
   # referenciado em 'shuffled'.
   shuffled+=($array[$index])

   # E para evitar que o elemento armazenado seja reutilizado, basta
   # remove-lo do vetor!
   # Obs.: Note que o vetor 'array' ao final do processo tera todos
   # os seus elementos removidos.
   array[$index]=()
done
print "$shuffled[*]"
# Fim

Scripts recomendados

Configurando interfaces de rede

montagem da pen drive

Algoritmo Fisher-Yates shuffle

Método para verificar e instalar pacotes

Gravar CD de dados


  

Comentários
[1] Comentário enviado por SMarcell em 20/03/2009 - 13:00h

Também postei esse código (e outros relacionados ao zsh) no 'CodeCodex':

http://codecodex.com/wiki/index.php?title=Main_Page

Confiram!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts