Estoy tratando de imprimir una n
palabra de letra aleatoria , donde ingreso n
desde la línea de comando, pero por alguna razón mi script me da la misma respuesta cada vez que uso el mismo valor para n
.
#!/bin/bash
num=$1
egrep "^.{$num}$" /usr/share/dict/words | head -n $RANDOM| tail -n 1
Estoy llamando a mi 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
donde var3.sh
está el nombre de mi script y 5 es la longitud de la palabra que quiero imprimir al azar.
¿Cómo consigo que imprima una palabra verdaderamente al azar?
$RANDOM
es bastante probable que sea mayor que el número de palabras n- letter para la mayoría de los valores de n (95.7% del tiempo para n = 3 para mí).shuf
osort -R
como se sugiere en las respuestas. También puede usar$RANDOM
, pero de una manera más avanzada. Todas estas herramientas producen resultados que pueden predecirse (no son realmente aleatorios), pero son lo suficientemente rápidos y buenos para muchos propósitos.Respuestas:
No lo hace. Pero $ RANDOM devuelve números grandes (entre 0 y 32767) que, especialmente para palabras de longitud limitada, muestra el mismo resultado, ya que la
head
porción probablemente devuelve todos los resultados del grep (para 3, solo hay 819 coincidencias en mi/usr/share/dict/words
).Una mejor solución podría ser barajar los resultados:
egrep "^.{$num}$" /usr/share/dict/words | sort -R | tail -n 1
donde
-R
significa--random-sort
(unasort
extensión GNU ).fuente
tail
? Eso tenía sentido en la secuencia de comandos de OP, pero como estás barajando, podrías usarlohead
, y luegosort
ser capaz de detectar la tubería rota y no molestarte en barajar el resto de las líneas.shuf -n1
, que es una pipa menos ...Un método simple para imprimir una palabra arbitraria num -letter utiliza
shuf
:El
shuf
comando genera una permutación aleatoria de la entrada y el-n1
indicador le dice que solo muestre el primer elemento de este resultado.fuente
grep -Ex ".{$num}"
. Oawk 'length == n' n="$num"'
.Como otros han señalado, el problema principal con su código es que la
$RANDOM
mayoría de las veces será un valor mucho mayor que el número de palabras de cierta longitud.Usando
awk
solo:El programa lee en todas las líneas del archivo dado que son de cierta longitud. Estos se almacenan en la matriz
words
.Al final, se selecciona e imprime un elemento aleatorio de esta matriz.
fuente