Estou tentando imprimir uma n
palavra de letra aleatória , onde insiro a n
partir da própria linha de comando, mas, por alguma razão, meu script está me dando a mesma resposta sempre que usar o mesmo valor para n
.
#!/bin/bash
num=$1
egrep "^.{$num}$" /usr/share/dict/words | head -n $RANDOM| tail -n 1
Estou chamando meu script como:
$ bash var3.sh 5
étude # always the same output when using 5
$ bash var3.sh 3
zoo # always the same output when using 3
onde var3.sh
é o nome do meu script e 5 é o tamanho da palavra que eu quero imprimir aleatoriamente.
Como faço para imprimir uma palavra verdadeiramente aleatória?
$RANDOM
é bem provável que seja maior que o número de palavras com n letras para a maioria dos valores de n (95,7% do tempo para n = 3 para mim).shuf
ousort -R
conforme sugerido nas respostas. Você também pode usar$RANDOM
, mas de uma maneira mais avançada. Todas essas ferramentas produzem resultados que podem ser previstos (eles não são verdadeiramente aleatórios), mas são rápidos e bons o suficiente para muitos propósitos.Respostas:
Não faz. Mas $ RANDOM retorna números grandes (entre 0 e 32767) que, especialmente para palavras de comprimentos limitados, mostram o mesmo resultado, pois a
head
parte provavelmente retorna todos os resultados do grep (para 3, existem apenas 819 correspondências no meu/usr/share/dict/words
).A melhor solução seria embaralhar os resultados:
egrep "^.{$num}$" /usr/share/dict/words | sort -R | tail -n 1
onde
-R
significa--random-sort
(umasort
extensão GNU ).fonte
tail
? Isso fazia sentido no script do OP, mas como você está embaralhando, também pode usarhead
e, em seguida,sort
deve ser capaz de detectar o cano quebrado e não se incomodar em embaralhar o restante das linhas.shuf -n1
, que é um cano a menos ...Um método simples para imprimir uma arbitrariedade num -Carta usos da palavra
shuf
:O
shuf
comando gera uma permutação aleatória da entrada, e o-n1
sinalizador informa para que ele somente produza o primeiro item desse resultado.fonte
grep -Ex ".{$num}"
. Orawk 'length == n' n="$num"'
.Como outros já apontaram, o principal problema do seu código é que, na
$RANDOM
maioria das vezes, será um valor muito maior do que o número de palavras de um determinado comprimento.Usando
awk
apenas:O programa lê todas as linhas do arquivo fornecido com um determinado comprimento. Estes são armazenados na matriz
words
.No final, um elemento aleatório dessa matriz é selecionado e impresso.
fonte