Numeros aleatorios [RESOLVIDO]

1. Numeros aleatorios [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 14/02/2010 - 00:54h

estou precisando gerar numeros aleatorios de 1 a 40

mas nao pode aparecer numeros repetidos

fiz algo assim, mas está aparecendo numeros repetidos

======================================================
#!/usr/local/bin/bash

numero=41
conta=1

until [ "$conta" -eq "$numero" ]; do
echo $((RANDOM % 40 + 1))
conta=$((conta + 1))
done

============================



  


2. MELHOR RESPOSTA

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 14/02/2010 - 04:53h

Acho que a linha:

var=`echo "$lista" | grep -w "$SORTEIO"`

não tá tão assustadora assim não porque esse é um jeito comum de usar o grep em uma variável.

Não sei se melhora, mas você pode utilizar Here Strings:

var=`grep -w "$SORTEIO<<<"$lista"`

Fora isso, só fiquei em dúvida na parte do:

carta_numero='CARTA'$SORTEIO
carta_numero2=`eval "echo $carta_numero"`
filtro=`grep -w "$carta_numero2" ./cartas`

Acho que essas três linhas podem ser substituídas por:
filtro=`grep -w "CARTA${SORTEIO}" ./cartas

Fiz uma versãozinha aqui, nem testei ainda =(
Botei o if direto na linha do echo/grep sem precisar de armazenar a saída
em uma variável, e coloquei o redirecionamento logo após o segundo grep.

Dê uma olhada ae e depois diga se funfou:

until [ "$conta" -eq "$numero" ]; do
SORTEIO=$((RANDOM % 40 + 1))

if ! echo "$lista" | grep -w "$SORTEIO"
grep -w "CARTA${SORTEIO}" ./cartas >> ./tmp/baralho
lista="$lista $SORTEIO"
conta=$((conta + 1))
fi

done

Espero ter ajudado.
t+

3. Re: Numeros aleatorios [RESOLVIDO]

Isaque Vieira de Sousa Alves
isaque_alves

(usa Fedora)

Enviado em 14/02/2010 - 01:04h

Talvez a solução mais apropriada seja armazenar o valor do 'último' $RANDOM em uma variável ou lista, e comparar depois se o valor já existe no array...
um exemplo de como usar arrays em Shell Script: Linux: Utilizando arrays em shell script [Dica] http://bit.ly/5szNud

Assim, ao final você terá um array com 39 elementos contendo todos os dados possíveis faltando apenas um único valor ainda não associado... Esta seria uma opção mais dispendiosa para a memória, mas vamos ver se alguém mais sugere algo diferente.




4. RESOLVI

Perfil removido
removido

(usa Nenhuma)

Enviado em 14/02/2010 - 01:07h

================================
#!/usr/local/bin/bash

rm -rf ./arquivo
touch ./arquivo
numero=41
conta=1

until [ "$conta" -eq "$numero" ]; do
SORTEIO=$((RANDOM % 40 + 1))
var=`grep -w "$SORTEIO" ./arquivo`
if [ -z "$var" ]; then
echo $SORTEIO >> ./arquivo
conta=$((conta + 1))
fi
done
========================================

o problema é que tenho que armazenar os arquivos em um arquivo, teria como fazer algo assim mas com variavel??


5. Re: Numeros aleatorios [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 14/02/2010 - 03:17h

Usando a dica do array: é só você colocar o número aleatório como índice de seu array:

#!/bin/bash

numero=41
conta=1
declare -a array_numeros

until [ "$conta" -eq "$numero" ]; do
SORTEIO=$((RANDOM % 40 + 1))
if [ -z ${array_numeros[$SORTEIO]} ]; then
echo $SORTEIO
array_numeros[$SORTEIO]=1
fi
conta=$((conta + 1))
done

Uma outra maneira é você armazenar os números em uma variável separados por espaço por exemplo, e aí
mandar um grep no valor dessa variável ao invés de um arquivo.

Acho que é isso.
t+


6. Re: Numeros aleatorios [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 14/02/2010 - 03:43h

tentei usar o grep na fariavel

mas fala que o arquivo nao existe

o modo que eu conheço é assim

grep $var arquivo

como faz p usar

grep $var $var2


7. Re: Numeros aleatorios [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 14/02/2010 - 03:54h

#!/usr/local/bin/bash

rm -rf ./tmp
mkdir ./tmp

numero=41
conta=1
lista=""

until [ "$conta" -eq "$numero" ]; do
SORTEIO=$((RANDOM % 40 + 1))
var=`echo "$lista" | grep -w "$SORTEIO"`
carta_numero='CARTA'$SORTEIO
carta_numero2=`eval "echo $carta_numero"`
filtro=`grep -w "$carta_numero2" ./cartas`
if [ -z "$var" ]; then
lista="$lista $SORTEIO"
echo "$filtro" >> ./tmp/baralho
conta=$((conta + 1))
fi
done

=======================================

pronto, ta tudo funcionando agr xD


8. Re: Numeros aleatorios [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 14/02/2010 - 03:56h

teria alguma forma de melhorar essa linha??

var=`echo "$lista" | grep -w "$SORTEIO"`

ou alguma parte do script??

está tudo funcionando, mas quero um script bem limpo


9. Re: Numeros aleatorios [RESOLVIDO]

Sandro Marcell
SMarcell

(usa Slackware)

Enviado em 14/02/2010 - 05:25h

Dá uma olhada:

http://www.slackbr.org/forum/viewtopic.php?f=45&t=17699

Talvez possa te ajudar.


10. Re: Numeros aleatorios [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 14/02/2010 - 15:52h

daemonio: funcionou certinho, soh faltou o ; then

===================================
numero=41
conta=1
lista=""

until [ "$conta" -eq "$numero" ]; do
SORTEIO=$((RANDOM % 40 + 1))
if ! echo "$lista" | grep -w "$SORTEIO"; then
grep -w "CARTA${SORTEIO}" ./cartas >> ./tmp/baralho
lista="$SORTEIO $lista"
conta=$((conta + 1))
fi
done
===================================

ficou muito rapido desse jeito, antes usando o eval e armazenando em variavel, acabou ficando lerdo

vlw


11. Re: Numeros aleatorios [RESOLVIDO]

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 14/02/2010 - 16:54h

Demorô!! Ow, obrigado pela melhor resposta =D
Gostei da sua idéia, já tô até utilizando seu script aqui.

Os códigos do SMarcell tão de boa também e me ajudaram muito. xD

Abraços
t+






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts