Pular para o conteúdo

Numeros aleatorios [RESOLVIDO]

Responder tópico
  • Denunciar
  • Indicar

1. Numeros aleatorios [RESOLVIDO]

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

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

Responder tópico

2. Re: Numeros aleatorios [RESOLVIDO]

Melhor resposta

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]

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

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]

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]

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]

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]

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

10. Re: Numeros aleatorios [RESOLVIDO]

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]

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+

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder