Embaralhando elementos de um vetor
Publicado por Sandro Marcell 19/03/2009
[ Hits: 7.385 ]
Homepage: http://sanmarcell.wordpress.com
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!!! =)
#!/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
Automatizar o controle de um servidor de compartilhamentos Samba
Estatística dos MB's consumidos pela internet
Resolver problemas de Internet
Como compartilhar a tela do Ubuntu com uma Smart TV (LG, Samsung, etc.)
Descritores de Arquivos e Swappiness
Solução rápida para o problema do Network Manager conectar mas não navegar
Como instalar no Linux Jogos da Steam só para Windows
Instalando o Team Viewer no Debian Trixie - problema no Policykit
Problemas latentes de performance no Ubuntu 25.04 (2)
Como rodo essa suinaria? [RESOLVIDO] (6)