shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Sorteio de numero aleatório


From: hl
Subject: Re: [shell-script] Sorteio de numero aleatório
Date: Thu, 22 Apr 2004 14:47:27 -0300 (BRT)

> Eu estava procurando a mesma solução só que entre 1 e 20. Então devo
> trocar o 99 por 19?
Sim,  Marco.

> Outra dúvida, e se eu quiser embaralhar os números de 1 a 20, como posso
> fazer? Fiz um script usando a variavel $RANDOM e jogando o número em um

Olha Marco, eu nao sei seu estou ajundando ou atrapalhando, mas lá vai.
Eu fiz um script agora pra embaralhar os numeros do jeito que você quer,
só que eu nao tenho à minha disposição um local pra testar a sintaxe, por
isso, o script provavelmente nao vai rodar de primeira.

Eu vou mandar o "pseudo-codigo" comentado e um exemplo da execucao para
torna-lo o mais claro possivel, mas eu nao tenho como corrigir os erros
de sintaxe no bash. Outra coisa: eu estou usando vetor no bash, pelo que
eu saiba nao sao todas as versoes de bash que aceitam isso, apesar de ter
a impressao que o bash2 (versao que aceita vetores) já está bem difundido.

Portanto, SE voce (ou alguem da lista :) tem uma versao de bash que aceita
vetor e SE voce conseguir entender os passos do algoritmo de forma que
voce consiga corrigir os meus erros, ENTAO eu acho que esse script vai
servir pra
você e deve ser mais rapido que o seu.

#!/bin/bash
# embaralha.sh
#
# Embaralha os numeros entre a($1) e b($2)

if [$# -ne 2]; then
   echo "Sintaxe: embaralha.sh <inicio> <fim>"
   exit
fi

if [$1 -ge $2]; then
   echo "O primeiro arqumento ($1) deve ser menor que o segundo ($2)"
   exit
fi

INICIO = $1
FIM = $2
TAM = $(( $FIM - $INICIO + 1 ))

# Monta um vetor de TAM posicoes com os numeros para
# serem embaralhados
i=1
while [ $i <= $TAM ]; do
   vetor[$i] = $(( $INICIO + $i ))
   i = $(($i + 1))
done

# Escolhe TAM numeros aleatorios
while [ $TAM -gt 0 ]; do
   num =`echo $[ ( $RANDOM * $TAM / 32767 ) + 1 ]`
   # procura o num-esimo elemento diferente de -1 em vetor
   cont=1 # conta o numero de elementos diferentes de -1
   j=1    # variavel indice do vetor
   while [ $j -le $TAM -a $cont -le $num ]; do # "-a" deve ser igual a "&"
      if [ vetor[$j] -ne -1 ]; then
         $cont = $(( $cont + 1 ))
      fi
   done
   echo vetor[$j] " - "
   vetor[$j] = -1
   TAM=$(( $TAM - 1 ))
done

---------------------------------------------------------
Exemplo do funcionamento
---------------------------------------------------------
bash$ embaralha.sh 1 6

INICIO=1
FIM   =6
TAM   =6
        +---+---+---+---+---+---+
vetor = | 1 | 2 | 3 | 4 | 5 | 6 |
        +---+---+---+---+---+---+

while ($TAM < 0) # como TAM=6, o script entra no laço
num = 5
o quinto numero diferente de -1 é o 5
imprime o 5 na tela
vetor[5] = -1
        +---+---+---+---+---+---+
vetor = | 1 | 2 | 3 | 4 |-1 | 6 |
        +---+---+---+---+---+---+
TAM = 5
# fim do while

while ($TAM < 0) # como TAM=5, o script entra no laço
num = 3
o terceiro numero diferente de -1 é o 3
imprime o 3 na tela
vetor[3] = -1
        +---+---+---+---+---+---+
vetor = | 1 | 2 |-1 | 4 |-1 | 6 |
        +---+---+---+---+---+---+
TAM = 4
# fim do while

while ($TAM < 0) # como TAM=4, o script entra no laço
num = 3
o terceiro numero diferente de -1 é o 4
imprime o 4 na tela
vetor[4] = -1
        +---+---+---+---+---+---+
vetor = | 1 | 2 |-1 |-1 |-1 | 6 |
        +---+---+---+---+---+---+
TAM = 3
# fim do while

while ($TAM < 0) # como TAM=3, o script entra no laço
num = 1
o primeiro numero diferente de -1 é o 1
imprime o 1 na tela
vetor[1] = -1
        +---+---+---+---+---+---+
vetor = |-1 | 2 |-1 |-1 |-1 | 6 |
        +---+---+---+---+---+---+
TAM = 2
# fim do while

while ($TAM < 0) # como TAM=2, o script entra no laço
num = 2
o segundo numero diferente de -1 é o 6
imprime o 6 na tela
vetor[6] = -1
        +---+---+---+---+---+---+
vetor = |-1 | 2 |-1 |-1 |-1 |-1 |
        +---+---+---+---+---+---+
TAM = 1
# fim do while

while ($TAM < 0) # como TAM=1, o script entra no laço
num = 1
o primeiro numero diferente de -1 é o 2
imprime o 2 na tela
vetor[2] = -1
        +---+---+---+---+---+---+
vetor = |-1 | 2 |-1 |-1 |-1 |-1 |
        +---+---+---+---+---+---+
TAM = 0
# fim do while

Termina o programa
Saida:
3 - 5 - 4 - 1 - 6 - 2 -




reply via email to

[Prev in Thread] Current Thread [Next in Thread]