Meu script produz a mesma saída ao usar $ RANDOM

8

Estou tentando imprimir uma palavra aleatória n , onde eu insiro n da própria linha de comando, mas por algum motivo meu script está me dando a mesma resposta toda vez que usar o mesmo valor para n .

#!/bin/bash                                                                                                                                       
num=$1
egrep "^.{$num}$" /usr/share/dict/words | head -n $RANDOM| tail -n 1

Eu 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

em que var3.sh é o nome do meu script e 5 é o tamanho da palavra que desejo imprimir aleatoriamente.

Como faço para imprimir uma palavra realmente aleatória?

    
por Karan Singh 12.06.2018 / 10:23

3 respostas

20

Isso não acontece. Mas $ RANDOM retorna números grandes (entre 0 e 32767) que, especialmente para palavras de comprimentos limitados, mostram o mesmo resultado, já que a porção head provavelmente retorna todos os resultados do grep (para 3, há apenas 819 correspondências em meu /usr/share/dict/words ).

Melhor solução pode ser embaralhar os resultados:

egrep "^.{$num}$" /usr/share/dict/words | sort -R | tail -n 1

onde -R significa --random-sort (uma extensão do GNU sort ).

    
por 12.06.2018 / 10:50
19

Um método simples para imprimir uma palavra de ordem num -letter usa shuf :

egrep "^.{$num}$" /usr/share/dict | shuf -n1

O comando shuf gera uma permutação aleatória da entrada, e o sinalizador -n1 informa a saída somente do primeiro item deste resultado.

    
por 12.06.2018 / 10:49
5

Como outros apontaram, o principal problema com o seu código é que $RANDOM mais frequentemente do que não será um valor muito maior do que o número de palavras de um determinado tamanho.

Usando apenas awk :

$ awk -v len="$num" 'length == len { word[i++]=$0 }
                     END { print word[int(i*rand())] }' /usr/share/dict/words
Bosniac

O programa lê em todas as linhas do arquivo fornecido que são de um certo tamanho. Estes são armazenados no array words .

No final, um elemento aleatório dessa matriz é selecionado e impresso.

    
por 12.06.2018 / 14:11

Tags